取消在集合中创建模型。与重复战斗

时间:2013-12-01 01:16:02

标签: javascript backbone.js backbone-collections

需要创建一个处理程序,它不会给创建副本。

Collection = Backbone.Collection.extend({
    model : Model,
    initialize : function() {
        this.on('add', this.actionCreate, this);
    },
    actionCreate : function(model, collection, param) {
        // handler...
    }
});
collection = new Collection();
collection.add({ chanel : 'starladder' });
// Should not be created because the parameter 'chanel' already exists with this value
collection.add({ chanel : 'starladder});

我准备尝试处理程序写somsing如:

if( this.where({ chanel : model.get('chanel').length } ) { model.destroy(); }

但没有工作。

1 个答案:

答案 0 :(得分:0)

有很多方法可以解决这个问题:)

首先,您可以在添加之前进行检查!然后无需担心使用Collection.remove()或Model.destroy()

if(!this.collection.findWhere({chanel: 'starladder'}))
  ...add...

作为旁注,这里你可能想要Collection.remove()而不是Model.destroy()因为你新添加的Model似乎没有id,所以不需要可能的服务器往返

其次,您的处理程序似乎有一些问题。 .where()将返回一个数组,因此你需要检查返回值的.length以查看它是否是> 0.或者您可以使用上面的findWhere,它将执行与where相同但返回该数组的第一个值,因此您不必担心执行[0]来获取该模型。

如果没有更多细节,很难说出你想要实现的最佳方式是什么,但似乎你正在使用 chanel 作为一种独特的ID ......?那么为什么不使用idAttribute属性让Backbone知道这是以独特方式定义模型的呢?显然,这只有在您没有真正的ID开始时才有效...

如果你需要 id chanel 都是唯一的,那么我只是在你提出的添加之前做一个检查并在我的路上+显然添加服务器端的相同唯一性条件,因为您永远不会知道+不允许用户在GUI中以任何方式选择相同的值两次(从select / dropdown / autocomplete中移除值,等等)。