【问题标题】:Why isn't this Child Computed Observable updated when it's observed array gets pushed to?当观察到的数组被推送到时,为什么这个 Child Computed Observable 没有更新?
【发布时间】:2013-01-14 18:47:31
【问题描述】:

我有一个简单的例子来说明这一点。取一个简单地保存一组项目的 a 。每一行都有一个可观察的属性,在这种情况下是一个日期。 ui 绑定到一组排序项,这只是一个计算的 observable。这个计算出的 observable 反过来正在监视一个计算出的 observable,它将过滤掉行。

为什么这不能按需要级联?

//simple table model
var TableModel = function(){
var self = this;
self.items = ko.observableArray([
new TableRowModel(5),
new TableRowModel(2),
new TableRowModel(9),
new TableRowModel(7)
]);
 self.filtered = ko.computed(function(){
return [self.items()[0], self.items()[1], self.items()[2]];
 });
 self.sortedItems = ko.computed(function(){
return _.sortBy(self.filtered(), function(item){
    return item.value();
});
});
};

var TableRowModel = function(value){
  var self = this;

self.value = ko.observable(new Date(2013, value, 1));
};

var model = new TableModel();
ko.applyBindings(model);

model.items.push(new TableRowModel(1));

【问题讨论】:

  • 示例:jsfiddle.net/tyzy5/19 我二月份的条目在哪里?它应该在此列表中排在第一位。

标签: knockout.js computed-observable


【解决方案1】:

您的代码一切正常。 “二月”不存在,因为它被过滤掉了。

push() 方法在最后一个位置插入新项目。 但是在您的 self.filtered 中,您只显示位置 0、1、2 的项目。但是当您调用 @ 987654325@ 在您的代码中,新项目将被插入位置 4,因此不会显示。

如果你想显示“二月”,你可以使用unshift

myObservableArray.unshift('Some new value') 在数组的开头插入一个新项

所以在你的代码中:

model.items.unshift(new TableRowModel(1));

这是更新后的JSFiddle

【讨论】:

  • Nemesv,我会给你答案,因为你写的非常正确。
  • 我尝试使用我的实际源重新创建问题,没有服务器交互逻辑,但无法重现问题。如果你熟悉 ASP.NET MVC,你愿意看我的原始源码吗?我觉得我目前还没有帮助社区解决这个问题,因为我基本上发布了一个微不足道的问题,并且似乎无法复制/演示我在开发中遇到的问题。
  • 没关系!我发现了我的问题。 observableArray 不侦听子对象的更新值(默认情况下),仅侦听新对象已被删除/添加到数组中。
  • @OliverKane 是的,你是对的:An observableArray tracks which objects are in the array, not the state of those objectsdocumentation. 中所述
猜你喜欢
  • 2013-03-14
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-15
  • 1970-01-01
  • 1970-01-01
  • 2021-06-01
相关资源
最近更新 更多