Javascript foreach项上的敲除绑定未更新

Javascript foreach项上的敲除绑定未更新,javascript,knockout.js,Javascript,Knockout.js,我正在使用按钮上的单击事件来设置使用foreach生成的项目的值 <table> <tbody data-bind="foreach: Employees"> <a data-bind="click:$parent.delete()"> .. 当我创建时,我将所有单独的属性设置为可观察的,但在foreach循环中它们似乎不是 更新 员工被过滤。计算 var Employees=ko.computed(function() { return

我正在使用按钮上的单击事件来设置使用
foreach
生成的项目的值

<table>
   <tbody data-bind="foreach: Employees">
   <a  data-bind="click:$parent.delete()">
..
当我创建时,我将所有单独的属性设置为可观察的,但在foreach循环中它们似乎不是

  • 更新
员工被过滤。计算

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

当您获取/设置可观察对象时,您需要这样调用它们:

var val = obj.prop(); //Getter
obj.prop(false); //Setter
另一个问题是,在单击绑定中使用括号。请记住,敲除绑定只是javascript,因此它在绑定时将实际执行该表达式

您需要去掉这些括号,否则
emp
最初将是未定义的

更新: 我已经更新了这个JSFIDLE,以包含三个过滤列表,类似于上面所示。您可以看到,通过computed命令使用过滤列表与knockout如何处理绑定无关,,并且UI会无缝更新


敲除订阅可观察数组,但不订阅该数组中的每个可观察数组。如果要订阅单个属性,则需要使用myObservable.subscribe()手动订阅


敲除订阅可观察数组,但不订阅该数组中的每个可观察数组。如果要订阅单个属性,则需要使用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();
        });
});

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


您的方法只是覆盖了可观察对象。

当我这样做时,我会得到一个错误,说它没有名为active的方法,那么
active
不能是可观察对象。我认为我们需要看到更多的代码来确定问题所在。你能创建一个JSFIDLE或者一些重现问题的东西吗?我会看看我能不能创建一个FIDLE。。。可能是因为它被过滤了吗?var Employees=ko.computed(函数(){return ko.utils.arrayFilter(AllEmployees(),函数(empid){return empid.ID==filter();});@user2643709-不,过滤列表不应该干扰可观察对象和绑定。我已经更新了我的小提琴,以证明通过计算使用过滤列表对绑定没有影响。感谢详细的示例,我能够找到问题。这是数组如何初始化的问题。有点……如果你有foreach的话绑定,然后在模板中设置单个绑定,然后当您更改单个项目时,UI将更新。您不必订阅单个项目,除非您纯粹是在代码中进行的。好的,他提到的方式是纯粹在代码中进行的…请留下来,我可以向您展示一些关于淘汰的内容。我更新了我的答案与编辑,应该有助于你。
var allEmployees = ko.observableArray([my data goes here]);

var Employees=ko.computed(function() {
 return ko.utils.arrayFilter(allEmployees(), function (emp) {
            return emp.active();
        });
});
emp.active(false);