backbone.js – 存储/推送到Backbone模型中的数组

我有这个模型认值:
test.Models.Itemmodel = Backbone.Model.extend({

defaults: {
    name: 'an item',units: []
},

然后我使用以下代码来设置模型:

addUnit: function(e){
    if(e.keyCode == 13){
      this.model.set({ 'units' : this.model.get('units').push($('#addUnit').val()) },{success: function(){
          this.render();
        }}
      );
    }
  },

但是,它似乎永远不会被添加到Model数组中,我在这里做事吗?

解决方法

问题是你假设push方法返回整个数组;相反,as stated here,推方法

Returns the new length property of the object upon which the method was called.

因此,在将元素设置为模型之前,需要将元素推入数组:

var _units = this.model.get('units');
_units.push($('#addUnit').val());
this.model.set({ 'units' : _units });

但是要小心,这将修改指向此数组的任何其他内容,因此如果您这样做,例如:

var myArray = [1,2,3]
this.model.set({units: myArray})
var _units = this.model.get('units')
_units.push(4)
this.model.set({ 'units' : _units })
myArray == this.model.get('units') // holy moly,they're the same :(

如果你想避免这种情况,或者仍然想要使用单行代码,你可以使用数组的concat method

this.model.set({ 
    'units' : this.model.get('units').concat($('#addUnit').val())
});

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...