Knockout js计算没被解雇

时间:2014-04-30 19:05:33

标签: javascript jquery knockout.js computed-observable

代码可以在http://jsfiddle.net/6kMWM/10/找到。

在FilterViewModel中,我正在创建一个可观察对象。

var FilterViewModel=  ko.observable({
    Name: ko.observable("test"),
    Code: ko.observable("test"),
    Number: ko.observable("test")
});

然后在BankViewModel中我运行一个计算方法,当任何输入框改变时它应该触发。

var BankViewModel = function(){
    var self = this;
        self.Collection = ko.observableArray([]),
        self.filteredCollection = ko.computed(function () {

            var filter = FilterViewModel();
            alert("invoked");
        }),
        self.add = function (bankObject) {
            self.Collection.push(bankObject);
        },
        self.isSelected = function (data) {
            $('.bank').css('background-color', 'white'); 
            $('.bank p').css('color', '#333');
            $('#bank-row-' + data.Code()).css('background-color', 'blue');
            $('#bank-row-' + data.Code()+" p").css('color', 'white');

        }
};

由于某种原因,它没有被解雇。任何人都可以帮帮我。

高级谢谢你

2 个答案:

答案 0 :(得分:0)

您需要使用如下语句实例化您的视图模型:

var model = new BankViewModel();

实例化模型时,最初会计算其计算方法。这是您的alert将会触发的地方。

但是,我假设您希望您的计算方法订阅名称,代码和数字属性。在这种情况下,您需要在计算方法中至少读取一次这些属性。

这是依赖关系跟踪在KO中的工作方式。它记录您在计算函数中提到的所有可观察对象并记录它们。当更新其中一个observable时,会再次计算您的计算结果。

对于您的代码,您的计算将订阅FilterViewModel不订阅其各自的属性 NameCodeNumber。因此,如果您需要订阅这些单独属性中的更改,则必须在计算函数中单独提及它们。好吧,如果计算机不能影响你的计算函数,那么让你的计算机订阅它们是没有意义的。

如果您想了解该过程的工作原理,请查看其文档: http://knockoutjs.com/documentation/computedObservables.html

答案 1 :(得分:0)

你的小提琴有几个问题:

  1. 绑定到值而不是可观察对象。当你写<input type="text" data-bind="value: global.filterViewModel().Name()" placeholder="Filter by Name"/>时,ko使用global.filterViewModel().Name的值而不是observable。因此没有真正的绑定(更新ko不会更新接口,更新接口不会更新ko)。您需要删除最后一个括号:global.filterViewModel().Name
  2. 在绑定
  3. 中放置Name而不是Code,反之亦然
  4. 您订阅了FilterViewModel的更改,但不是它的子可观察更改。为此,请在计算的observable中包含对子可观察量的评估:
  5. -

    self.filteredCollection = ko.computed(function () {
        var filter = FilterViewModel();    
        if (filter.Name() != 'testname')
            alert("name");
        if (filter.Code() != 'testcode')
            alert("code");
        if (filter.Number() != 'testnumber')
            alert("number");
    }),
    

    您可以在这里测试http://jsfiddle.net/b37tu/1/