假设我有以下Backbone.js模型:
class App.Models.Article extends Backbone.Model
defaluts:
id: ''
name: ''
tags: []
以及显示其内容的视图。在主视图中,我通过将新创建的文章传递为:
来创建文章视图的实例 v = new App.Views.ArticleView({ model: new App.Models.Article() })
并将其呈现给页面。
在文章视图和用户交互中,通过以下代码将一些标签添加到标签数组中:
addTag: ->
tags = @model.get('tags')
tags.push({id: '', name: 'foo'})
tags.push({id: '', name: 'bar'})
到目前为止一切顺利!然后我关闭文章视图并渲染另一个视图。后来我想再次渲染文章视图,所以代码:
v = new App.Views.ArticleView({ model: new App.Models.Article() })
再次跑。
问题出在渲染之后,我仍然可以看到以前在tags数组中输入的标签,即如果在文章视图中,我写道:
console.log(@model.get('tags'))
它将输出之前添加的两个对象。我希望每个实例在创建时都有其默认值,而不是没有更多引用的实例。有任何想法吗?有关Coffescript的任何问题吗?
P.S。我希望问题陈述足够清楚:)
答案 0 :(得分:0)
不要在默认情况下使用数组和对象,它们将在模型实例之间共享。如果您希望标签为空数组,请在初始化函数中添加。
var MyModel = Backbone.Model.extend({
initialize:function(){
this.set('tags', [])
}
})
答案 1 :(得分:0)
解决!
问题是Coffeescript将默认值附加到原型,因此定义默认值如下解决了问题:
defaults: ->
id: ''
name: ''
tags: []
它再次附加到原型上,但作为一个函数,它为每个调用返回一个空对象。