之间似乎存在差异
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。
- 有人能解释一下原因吗?据我所知,文档
new Model.List()
和Model.findAll()
都返回一个can.Model.List
- 当结果为空列表时,不会触发任何事件。这不应该至少触发
length
事件吗
需要明确的是,Model.findAll()
返回一个解析为列表的promise。
原因是:
Model.findAll({}, function(items) {
viewModel.attr('items', items);
});
实际上并没有改变"项目"的长度items"设置为已具有长度的列表,并且该长度永远不会更改。因此,"{items}length"在items或长度更改时不会回调,只有在当前"items"长度更改时才会回调。
这与不同
viewModel.attr('items', new Model.List({}));
它将"items"设置为一个最初为空的列表。稍后,该列表将使用项进行更新,从而更改"项"列表的长度属性。