CanJS: Model.findAll() vs new Model.List()



之间似乎存在差异

can.Component.extend({
viewModel: {
items: new Model.List(),
updateItems: function(viewModel) {
viewModel.attr('items', new Model.List({}));
}
}

can.Component.extend({
viewModel: {
items: new Model.List(),
updateItems: function(viewModel) {
Model.findAll({}, function(items) {
viewModel.attr('items', items);
});
}
}

因为前者会触发项上的更改事件,但后者不会,请参阅jsfiddle。

  1. 有人能解释一下原因吗?据我所知,文档new Model.List()Model.findAll()都返回一个can.Model.List
  2. 当结果为空列表时,不会触发任何事件。这不应该至少触发length事件吗

需要明确的是,Model.findAll()返回一个解析为列表的promise。

原因是:

Model.findAll({}, function(items) {
viewModel.attr('items', items);
});

实际上并没有改变"项目"的长度items"设置为已具有长度的列表,并且该长度永远不会更改。因此,"{items}length"在items或长度更改时不会回调,只有在当前"items"长度更改时才会回调。

这与不同

viewModel.attr('items', new Model.List({}));

它将"items"设置为一个最初为空的列表。稍后,该列表将使用项进行更新,从而更改"项"列表的长度属性。

最新更新