2013-10-15 2 views
2

Мне нужно указать, была ли модель внутри add событие было получено с collection.fetch или создано collection.create. Является ли это возможным?Возможно ли узнать, какой из них вызвал событие добавления коллекции: выборка или создание вызова?

collection.on('add', onModelAdded) 
collection.fetch() 
collection.create({}) 

function onModelAdded(model, collection, options) { 
    // created or fetched? 
} 
+1

Вы пытались переопределить 'create', чтобы что-то копировать через' options'? –

+0

@muistooshort хорошая идея, пытаясь реализовать ее прямо сейчас. –

+0

@muistooshort это сработало, спасибо. Пожалуйста, отправьте ответ, и я приму его. –

ответ

2

Я предположим, что что-то вроде этого create переопределение будет работать:

create: function(attributes, options) { 
    options = options || { }; 
    options.came_from_create = true; 
    return Backbone.Collection.prototype.create.call(this, attributes, options); 
} 

Тогда вы могли бы найти came_from_create в обратном вызове:

function onModelAdded(model, collection, options) { 
    if(options && options.came_from_create) { 
     // We started in a create call on the collection. 
    } 
    else { 
     // We came from somewhere else. 
    } 
} 

Вы можете обычно использовать options аргумент поросенок обратно бит данных вокруг, если вы осторожны, чтобы не использовать какие-либо имена опций, которые Backbone хочет использовать ,

0

из Backbone Docs

isNew

ли эта модель была сохранена на сервере еще? Если модель еще не имеет идентификатора, считается, что она новая.

источник Backbone:

isNew: function() { 
    return this.id == null; 
}, 

При создании модели не настройки идентификатора, то это новая модель (модель без ид рассматривается как новый), и, следовательно, model.isNew() возвращает истину

function onModelAdded(model, collection, options) { 
    if(model.isNew()){ 
     // It's created 
    }else{ 
     // It's fetched! 
    } 
} 
+0

К сожалению, я не могу полагаться на это, потому что у меня может быть '{wait: true}'. –

+0

Другая идея состоит в том, чтобы установить флаг (путем переопределения магистральная создать метод) и после того, как модель сохранить полную отключенное флаг, 'создать: функция (модель, сбор) { ... если (options.wait) { модель .createdNew = true; model.once ('синхронизация', функция() {удалить this.createdNew};} ... } ' Не можете проверить это решение, но надеюсь, что это работает! –