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
回答1件
あなたの回答
tips
プレビュー