【问题标题】:Backbone.js model: attribute of type array maintains data between instancesBackbone.js 模型:类型数组的属性维护实例之间的数据
【发布时间】:2013-10-31 02:51:34
【问题描述】:

假设我有以下 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() })

再次运行。

问题是渲染后,我仍然可以在标签数组中看到以前输入的标签,即如果在文章视图中,我写:

     console.log(@model.get('tags'))

它将输出之前添加的两个对象。我希望每个实例在创建时都有其默认值,而不是不再引用它的东西。有任何想法吗? Coffescript 有什么问题吗?

附:我希望问题陈述足够清楚:)

【问题讨论】:

  • 甚至在我关闭文章视图之前,我都会调用 @remove 来删除它并调用 @model.clear().set(@model.defaults),还是一样的问题。
  • coffeescript 生成 Article.prototype.defaults =,它将默认值附加到 Article 对象的原型。也许问题出在这一点上?!
  • 很好的问题,为什么coffeescript 编译这样的东西?!这也会使任何属性出现问题,甚至是非数组/对象属性。

标签: arrays backbone.js coffeescript


【解决方案1】:

不要在默认值中使用数组和对象,它们将在模型实例之间共享。如果您希望标签为空数组,请将其添加到初始化函数中。

var MyModel =  Backbone.Model.extend({
    initialize:function(){
        this.set('tags', [])
    }
})

【讨论】:

    【解决方案2】:

    解决了!

    问题是Coffeescript将默认值附加到原型中,因此定义默认值如下解决问题:

        defaults: ->
          id: ''
          name: ''
          tags: []
    

    它再次附加到原型,但作为一个函数,它为每次调用返回一个空对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-28
      • 2021-10-07
      • 2012-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-29
      • 2011-01-19
      相关资源
      最近更新 更多