对foreach项目的敲除绑定不更新

时间:2013-08-01 21:16:03

标签: javascript knockout.js

我在按钮上使用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();
        });

3 个答案:

答案 0 :(得分:3)

当你获得/设置observable时,你需要像这样调用它们:

var val = obj.prop(); //Getter
obj.prop(false); //Setter

您遇到的另一个问题是您在点击装订中使用了括号。请记住,Knockout绑定只是javascript,因此它会在绑定时实际执行该表达式。

您需要摆脱这些括号,否则emp最初将是未定义的。

UPDATE:

我已经更新了这个jsFiddle以包含三个类似于上面显示的过滤列表。您可以看到通过计算使用筛选列表与敲除处理绑定的方式无关,并且UI无缝更新。

http://jsfiddle.net/jwcarroll/ceRPK/

答案 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();
        });
});