Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js:获取集合后引发模型更改事件?_Backbone.js - Fatal编程技术网

Backbone.js:获取集合后引发模型更改事件?

Backbone.js:获取集合后引发模型更改事件?,backbone.js,Backbone.js,我有一个带有name属性的模型,该模型在属性更改时将调用绑定函数: var Workitem=Backbone.Model.extend({ 初始化:函数(){ this.bind('change:name',function()){ 警报(“名称”); } }); }, 默认值:{ 姓名:“姓名” } }); 如果我获取一个模型,这会起作用,并且在设置属性和获取数据时会触发更改事件 但是,我已经创建了一个集合,并且我希望在fetch方法期间为集合中的每个已获取模型触发事件: var Work

我有一个带有name属性的模型,该模型在属性更改时将调用绑定函数:

var Workitem=Backbone.Model.extend({
初始化:函数(){
this.bind('change:name',function()){
警报(“名称”);
}
});
},
默认值:{
姓名:“姓名”
}
});
如果我获取一个模型,这会起作用,并且在设置属性和获取数据时会触发更改事件

但是,我已经创建了一个集合,并且我希望在fetch方法期间为集合中的每个已获取模型触发事件:

var WorkitemList=Backbone.Collection.extend({
型号:Workitem,
});
var workitemsList=新的workitemsList();
workitemsList.fetch();

这可能吗?

获取集合将用服务器响应替换集合中的模型。。它不会更新集合中您想要的每个模型。。最简单的修复方法是在集合中循环获取每个模型,但是您有多个对服务器的请求,并且错过了任何新添加的模型


我认为,要实现这一目标,您需要创建并获取收藏的另一个实例,然后将其中的模型与原始收藏进行比较,并根据需要进行更新。。不太漂亮。

您可以覆盖集合的
fetch
-函数,分别对每个模型调用fetch。但这是非常野蛮的力量

fetch: function() {
  for (var model: this.models) {
    model.fetch();
  }
}

任何人都有更好的方法来实现这一点吗?

导入完成后,Fetch会触发集合上的“重置”事件。听一听,然后启动/搞乱模型。

你为集合和模型设置了url吗,或者这些值只是从某处神奇地出现了吗?嗨,Jake,我使用的是backbone.localStorage.js,所以当我执行抓取时,数据是从HTML5本地存储读取的,但我认为这与我的问题无关。当我对单个模型(存储在localStorage中)执行相同操作时,将在获取后触发更改事件,但如果模型是集合项,则此操作不起作用Hi Lecstor,感谢您的回答。我正在尝试在fetch()方法之后循环到模型以执行您的解决方法,但这不起作用(警报返回的是零,而不是获取的项目数):
var WorkitemList=Backbone.Collection.extend({model:Workitem,initialize:function(){this.fetch({success:alert(this.length)});})我认为应该更像
var WorkitemList=Backbone.Collection.extend({model:Workitem,initialize:function(){this.fetch({success:function(Collection,response){alert(Collection.length)}};})