我在按钮上使用click事件来设置使用foreach
生成的项目的值。
<table>
<tbody data-bind="foreach: Employees">
<a data-bind="click:$parent.delete()">
..
在我的删除功能中,我正在设置值,但它不会更新屏幕
Delete :(emp) {
emp.active=false;
}
当我创建时,我将所有单独的属性设置为observable,但在foreach循环中似乎不是这样。
员工已过滤。计算
var Employees=ko.computed(function() {
return ko.utils.arrayFilter(AllEmployees(), function (empid) {
return empid.ID == filter();
});
答案 0 :(得分:3)
当你获得/设置observable时,你需要像这样调用它们:
var val = obj.prop(); //Getter
obj.prop(false); //Setter
您遇到的另一个问题是您在点击装订中使用了括号。请记住,Knockout绑定只是javascript,因此它会在绑定时实际执行该表达式。
您需要摆脱这些括号,否则emp
最初将是未定义的。
我已经更新了这个jsFiddle以包含三个类似于上面显示的过滤列表。您可以看到通过计算使用筛选列表与敲除处理绑定的方式无关,并且UI无缝更新。
答案 1 :(得分:1)
要设置一个observable,你必须调用它(因为observable实现为函数):
emp.active(false);
您的方法只是覆盖了observable。
答案 2 :(得分:0)
Knockout订阅可观察数组,但不订阅该数组中的每个observable。如果要订阅单个属性,则需要使用myObservable.subscribe()手动订阅
Knockout订阅可观察数组,但不订阅该数组中的每个observable。如果要订阅单个属性,则需要使用myObservable.subscribe()手动订阅
修改强>
如果你想让你的计算机跟踪计算中的内容你可以这样做 -
var allEmployees = ko.observableArray([my data goes here]);
var Employees=ko.computed(function() {
return ko.utils.arrayFilter(allEmployees(), function (emp) {
return emp.active === true;
});
});
如果active不是每个allEmployees()的可观察属性,则该方法有效。如果它是一个可观察的,只需将其改为 -
var allEmployees = ko.observableArray([my data goes here]);
var Employees=ko.computed(function() {
return ko.utils.arrayFilter(allEmployees(), function (emp) {
return emp.active();
});
});