代码可以在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');
}
};
由于某种原因,它没有被解雇。任何人都可以帮帮我。
高级谢谢你
答案 0 :(得分:0)
您需要使用如下语句实例化您的视图模型:
var model = new BankViewModel();
实例化模型时,最初会计算其计算方法。这是您的alert
将会触发的地方。
但是,我假设您希望您的计算方法订阅名称,代码和数字属性。在这种情况下,您需要在计算方法中至少读取一次这些属性。
这是依赖关系跟踪在KO中的工作方式。它记录您在计算函数中提到的所有可观察对象并记录它们。当更新其中一个observable时,会再次计算您的计算结果。
对于您的代码,您的计算将订阅FilterViewModel
但不订阅其各自的属性 Name
,Code
和Number
。因此,如果您需要订阅这些单独属性中的更改,则必须在计算函数中单独提及它们。好吧,如果计算机不能影响你的计算函数,那么让你的计算机订阅它们是没有意义的。
如果您想了解该过程的工作原理,请查看其文档: http://knockoutjs.com/documentation/computedObservables.html
答案 1 :(得分:0)
你的小提琴有几个问题:
<input
type="text" data-bind="value: global.filterViewModel().Name()"
placeholder="Filter by Name"/>
时,ko使用global.filterViewModel().Name
的值而不是observable。因此没有真正的绑定(更新ko不会更新接口,更新接口不会更新ko)。您需要删除最后一个括号:global.filterViewModel().Name
-
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/