質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Knockout.js

KnockoutJSは、Model-ViewView-Model(MVVM)を用いたダイナミックなHTML ULのためのオープンソースのJavaScriptライブラリです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

577閲覧

knockout.jsで文字列をフィルターする機能

keshibat

総合スコア8

Knockout.js

KnockoutJSは、Model-ViewView-Model(MVVM)を用いたダイナミックなHTML ULのためのオープンソースのJavaScriptライブラリです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/08/21 07:20

編集2018/08/22 03:25

kockout.jsを使って、リストの文字列ををフィルターする機能の簡易なサイトを作っています。
例文サンプルを参考に var locationsにjson objectを指定して、そこのデータをknockoutを使って、フィルター機能を作成したいです。

発生している問題・エラーメッセージ

現在発生しているエラーは以下です。

i.toLowerCase is not function

該当のソースコード

JS

1var locations = [ 2 {name: 'Auckland', location: {lat: 40.7713024, lng: -73.9632393}}, 3 {name: 'Raglan', location: {lat: 40.7444883, lng: -73.9949465}}, 4 {name: 'Napier', location: {lat: 40.7347062, lng: -73.9895759}}, 5 {name: 'Ahipara', location: {lat: 40.7281777, lng: -73.984377}}, 6 {name: 'New Plymouth', location: {lat: 40.7195264, lng: -74.0089934}}, 7 {name: 'Wellington', location: {lat: 40.7180628, lng: -73.9961237}} 8]; 9 10 11var Location = function(data) { 12 this.name = data.name 13} 14 15var ViewModel = function() { 16 var self = this; 17 this.myLocations = ko.observableArray([]); 18 locations.forEach(function(locationItem){ 19 self.myLocations.push( new Location(locationItem) ); 20 }); 21 this.filter = ko.observable(""); 22 this.filterdLocations = ko.computed(function() { 23 var filter = self.filter().toLowerCase(); 24 if (!filter) { 25 return self.myLocations(); 26 } 27 return self.myLocations().filter(function(i) { 28 return i.toLowerCase().indexOf(filter) > -1; }); 29 30 }); 31} 32 33ko.applyBindings(new ViewModel());

HTML

1Search: <input data-bind="textInput: filter" /> 2<table> 3 <tbody data-bind="foreach: filterdLocations"> 4 <tr><td data-bind="text: name"></td></tr> 5 </tbody> 6</table> 7<script src="js/Lib/knockout-3.4.2.js"></script> 8<script src="js/app.js" type="text/javascript"></script>

試したこと

iのプロパティーにJsonObject Locationsのnameを指定する

return i.name.toLowerCase().indexOf(filter) > -1;

試した後のエラー

Uncaught ReferenceError: filter is not defined

補足情報(FW/ツールのバージョンなど)

これをお手本に作成しています。
https://codepen.io/caitlinrouille/pen/qqaQEW

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/08/21 07:26

質問編集画面タイトル横にある「初心者アイコン」をご活用ください。「初心者」と質問で書くよりも伝わりますし、質問一覧に表示されるのでわかりやすくなります。
spookybird

2018/08/21 08:44

スコープの話ではないと思います。self.myLocations().filterに渡したコールバック関数の引数"i"に何が渡ってきているか確認してみましたか?本当に"i"はtoLowerCase()関数を持っていますか?
keshibat

2018/08/22 08:57 編集

iのプロパティーにJsonObject Locationsのnameを指定したら、オッケーでした。
guest

回答1

0

自己解決

js

1 var ViewModel = function() { 2 var self = this; 3 this.myLocations = ko.observableArray([]); 4 locations.forEach(function(locationItem){ 5 self.myLocations.push( new Location(locationItem) ); 6 }); 7 this.filter = ko.observable(""); 8 this.filterdLocations = ko.computed(function() { 9 var filter = self.filter().toLowerCase(); 10 if (!filter) { 11 return self.myLocations(); 12 } 13 return self.myLocations().filter(function(i) { 14 return i.name.toLowerCase().indexOf(filter) > -1; }); 15 }); 16};

投稿2018/08/22 08:57

keshibat

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問