Javascript 主干收集';解析后的s模型

Javascript 主干收集';解析后的s模型,javascript,json,backbone.js,backbone.js-collections,backbone-model,Javascript,Json,Backbone.js,Backbone.js Collections,Backbone Model,我有这个模型和它的收藏: app.models.Result= Backbone.Model.extend({ idAttribute: 'uid', initialize: function () { this.set('name', this.get('name').replace(' ', '').substring(0, 20)); }, }); app.models.ResultList = Backbone.Collection.ext

我有这个模型和它的收藏:

app.models.Result= Backbone.Model.extend({

    idAttribute: 'uid',

    initialize: function () {
        this.set('name', this.get('name').replace(' ', '').substring(0, 20));
    },

});

app.models.ResultList = Backbone.Collection.extend({

    model: app.models.Result,
    url: 'http://localhost/stuff',

    parse: function (response, options) {
        this.add(response.data);
        console.log(this);
        return response.data;
    },

});
然后我在视图的
initialize()
函数中使用它,如下所示:

var that = this;
this.collection = new app.models.SearchList();
this.collection.fetch({
    dataType: 'jsonp',
    success: function () {
        console.log(that.collection);
        that.collection.each(function (resultModel) {
            console.log('ok');
        });
    }
});
通过这段代码,我几乎得到了我想要的,但是当我查看第二个
log()
时,我可以看到
name
属性与获取的JSON中的属性相同

我猜是因为我只是返回了
响应.data
,所以我将其修改为
this
。在这种情况下,我得到一个错误:

未捕获的TypeError:无法调用未定义的方法“replace”

所以我把那句话注释掉了。现在我可以看到所有的模型都不见了。数组中只有一个模型,但不是JSON中的模型


我心爱的模特怎么了?他们在哪里?我应该怎么救他们吗?在第一个日志中,
这个
指向正确的完整集合,那么为什么不返回
这个
给我相同的正确集合。

当您返回
响应时,数据是正确的。
来自
集合。解析
。引述:

函数传递原始响应对象,并应返回要添加到集合中的模型属性数组

我认为您的问题在于您正在调用
this。从
集合中添加
。解析
-您不需要执行此操作,因为调用
集合。解析
的函数将为您处理此问题

我认为,当您这样做时,模型是在调用
add
时添加的,但是集合调用
Collection.set
——这会导致您修改的所有名称值被服务器版本替换

回应您的评论:
Collection.set
作为
集合的一部分被调用。fetch
-这正是主干默认的工作方式(尽管您可以让它调用
Collection.reset
,如果您愿意,通过传入一个选项)。解决问题的最简单方法就是删除
集合。从
parse
函数中添加
调用-这样
集合。set
将按照您的预期运行

初始化
函数仅在初始化模型时调用。如果您想在第一次创建模型时更改模型的属性,这是一个地方。但是,您可以通过调用
this.add
,然后通过从
parse
返回数据来更新该数据来创建模型,这会导致覆盖初始化更改

另一种方法是更新
parse
函数,根据需要转换数据,然后返回该函数


或者,如果要设置的值为
name

,则可以覆盖模型中的set函数,以转换传递的数据。感谢您的回复。我明白你在说什么,但是为什么要调用
集合.set
?更重要的是:我如何解决这个问题?如何将更改应用于模型中的
name
属性?我认为初始化函数是正确的方法。如果
set
覆盖了我在那里所做的操作,那么初始化的目的是什么?@totymedli我添加了更多的细节,并给出了具体的操作说明。简单地说:不要调用
这个。在
解析中添加
,非常感谢!现在我完全理解了整个过程,你给我的建议让代码工作得很有魅力!再次感谢你。