过滤器与knockout.js绑定的问题

时间:2017-06-08 01:00:21

标签: javascript knockout.js

我正在使用Knockout.js框架,我在代码中遇到以下错误,我正在使用Knockout.js构建一个应用程序,一切正常,除非我尝试创建dependentObservable。

这是javascript代码:

(function() {
  'use strict';

    console.log("This is my Application");

     var app = {
         mapElement: document.getElementById('map'),
         mapObj: map,
         locations : ko.observableArray([
            {id: 1, title: 'Holywood Theater', location: {lat: 43.098344, lng: -76.145697}},
            {id: 2, title: 'Mattydale Fire Department', location: {lat: 43.098172, lng: -76.142189}},
            {id: 3, title: 'Original Italian Pizza', location: {lat: 43.098854, lng:  -76.144700}},
            {id: 4, title: 'Roxboro Road Middle School', location: {lat: 43.101110, lng: -76.150901}},
            {id: 5, title: 'Big Lots', location: {lat: 43.101400, lng: -76.146985}},
            {id: 6, title: 'Camnel pub', location: {lat: 43.098670, lng: -76.145832}}
        ]),
        markers:[],
        textFilter: ko.observable(),
        filterLocations: ko.dependentObservable(function () {
                            return ko.utils.arrayFilter(app.locations(), function (loc) {
                                return loc.title().toLowerCase().includes(app.textFilter().toLowerCase());
                            });
                        })
     };

    ko.applyBindings(app);
})();

Chrome控制台中的错误是:

  

未捕获的TypeError:无法读取未定义的属性“位置”

2 个答案:

答案 0 :(得分:1)

您无法使用' app' var因为你还在创造它。

var app = {... 

    ^^^    return ko.utils.arrayFilter(app.locations(), ...

                                       ^^^

答案 1 :(得分:0)

对viewmodels使用object literal时,应将计算/从属observable定义为

app.filterLocations = ko.computed(function () {
                        return ko.utils.arrayFilter(this.locations(), function (loc) {
                            return loc.title.toLowerCase().includes(app.textFilter().toLowerCase());
                        });
                    }, app);

注意将app对象作为第二个参数传递给定义this范围的计算函数。

同时使用computed代替dependentObservable

Computed Observables