【问题标题】:Knockout binding on foreach item not updatingforeach 项目的淘汰赛绑定未更新
【发布时间】:2013-08-03 00:07:55
【问题描述】:

我正在使用按钮上的单击事件来设置使用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();
        });

【问题讨论】:

  • 我更新了我的答案,并进行了对您有所帮助的编辑。

标签: javascript knockout.js


【解决方案1】:

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

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

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

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

更新:

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

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

【讨论】:

  • 当我这样做时,我得到一个错误,说它没有一个名为 active 的方法
  • 那么active 不能是可观察的。我认为我们需要查看更多代码才能确定问题出在哪里。您可以创建一个 jsFiddle 或重现问题的东西吗?
  • 我会看看我是否可以创建一个小提琴...会不会是因为它被过滤了? var Employees=ko.computed(function() { return ko.utils.arrayFilter(AllEmployees(), function (empid) { return empid.ID == filter(); });
  • @user2643709 - 过滤后的列表根本不应该干扰可观察对象和绑定。我更新了我的小提琴以证明通过计算使用过滤列表对绑定没有影响。
  • 感谢详细的示例,我能够找到问题所在。数组的初始化方式有问题。
【解决方案2】:

要设置一个 observable,你必须调用它(因为 observable 是作为函数实现的):

emp.active(false);

您的方法只是覆盖了 observable。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 排序...如果您有一个 foreach 绑定并且您在模板中设置了单独的绑定,那么当您更改单独的项目时 UI 将更新。除非您纯粹在代码中进行,否则您不必订阅单个项目。
    • 嗯,他提到的方式纯粹是在代码中实现...jsfiddle.net/hTVs9 坚持下去,我可以向您展示一些关于 Knockout 的内容。
    猜你喜欢
    • 2014-02-21
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 2014-08-20
    • 2014-10-30
    • 2017-05-11
    相关资源
    最近更新 更多