4

我正在使用按钮上的 click 事件来设置使用foreach.

<table>
   <tbody data-bind="foreach: Employees">
   <a  data-bind="click:$parent.delete()">
..

在我的删除功能中,我正在设置值,但它不会更新屏幕

 Delete :(emp) {
  emp.active=false;
}

当我创建时,我将所有单个属性设置为可观察的,但在 foreach 循环中似乎它们不是。

  • 更新

员工被过滤。计算

var Employees=ko.computed(function() {
 return ko.utils.arrayFilter(AllEmployees(), function (empid) {
            return empid.ID == filter();
        });
4

3 回答 3

3

当您获取/设置 observables 时,您需要像这样调用它们:

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

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

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

更新:

我已更新此 jsFiddle 以包含三个过滤列表,类似于您在上面显示的内容。您可以看到,通过计算使用过滤列表与敲除如何处理绑定无关,并且 UI 会无缝更新。

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

于 2013-08-01T21:19:16.037 回答
1

要设置一个可观察对象,您必须调用它(因为可观察对象是作为函数实现的):

emp.active(false);

您的方法只是覆盖了 observable。

于 2013-08-01T21:19:44.930 回答
0

Knockout 订阅 observable 数组,但不订阅该数组中的每个 observable。如果您想订阅单个属性,您需要使用 myObservable.subscribe() 手动订阅

Knockout 订阅 observable 数组,但不订阅该数组中的每个 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();
        });
});
于 2013-08-01T21:19:24.147 回答