2013-04-10 2 views
5

Я знаю, что я могу установить значение атрибута модели базовой линии, чтобы оно не вызывало событие, используя {silent: true}. Я также знаю, что если я установлю атрибут модели на уже имеющееся значение, это не вызовет событие изменения, что почти всегда хорошо. Однако есть ли способ заставить обновление для модели инициировать событие изменения, даже если оно установлено на одно значение?Могу ли я заставить обновление атрибуту модели регистрироваться как изменение, даже если это не так?

Так что, если в моей модели я поставил:

defaults:{ 
    attributeToChange: "myValue" 
} 

И тогда в целях использования этой модели я называю:

this.model.set('attributeToChange', 'myNewValue', {silent:true}); 

значение будет меняться, но ни одно событие изменений не будет уволен , Но что, если бы я хотел, чтобы событие изменения срабатывало всякий раз, когда значение атрибута было установлено независимо от того, на что оно было установлено? Так что если вместо этого я просто сделал

this.model.set('attributeToChange','myValue'); 

Есть ли параметр, который я могу добавить, который заставит это рассматриваться как изменение? Я считаю, что я могу использовать

this.model.trigger('change:attributeToChange'); 

, но я хотел бы знать, если есть способ, чтобы заставить событие изменения стрелять без этого.

Вопрос о бонусе: если я установил атрибут модели к уже имеющемуся значению, делает ли это атрибут предыдущим значением, которое у него было до того, как я инициировал изменение?

this.model.set('attributeToChange','someValue'); 
this.model.set('attributeToChange','anotherValue'); 
this.model.set('attributeToChange','anotherValue'); 
console.log(this.model.previous('attributeToChange')); //someValue or anotherValue? 
+0

Хорошо, позвольте мне попытаться ответить на мой собственный бонус вопрос, так как я понял, что это будет достаточно легко проверить сразу после того, я написал это: кажется, что если установить значение атрибута модели на значение, которое она уже имеет, предыдущее значение модели для этого атрибута _ (this.model.previous (...)) _ будет регистрироваться как то, что было до того, как вы установите значение _new_ (но дублируетесь). Поэтому приведенный выше пример должен написать «anotherValue» на консоли. – flyingace

ответ

3

К сожалению, здесь ничего нет. Думаю, вы могли бы изменить код метода set, но это было бы довольно уродливо. Другим решением было бы переопределить его в начале или в конце (это «простые» изменения, которые вы можете сделать, чтобы переопределить метод).

Для начала проблема заключается в том, что ваши атрибуты еще не установлены (и не подтверждены ни тем, ни другим).
Итак, давайте посмотрим на конец.

var set = Backbone.Model.prototype.set; 
Backbone.Model.prototype.set = function() { 
    // do stuff before 
    set.apply(this, arguments); 
    // do stuff after 
    this.trigger('myCustomEvent'); 
    return this; 
}; 

(я не думаю, что вы должны сделать это до определения ваших моделей, но это может быть.)

4

При установке значения в модели Backbone, Backbone будет сравнивать новое значение для текущих и добавьте измененные значения в массив (см. https://github.com/documentcloud/backbone/blob/master/backbone.js#L342).

Затем, если массив changes содержит элемент, базовая станция запускает событие «change: {key}» для каждого измененного элемента, если для параметра silent не установлено значение true. (см. https://github.com/documentcloud/backbone/blob/master/backbone.js#L357).

И, наконец, это также вызовет глобальное событие «изменения» (опять же, если тихий не установлен в true).

Итак, если вы хотите принудительно активировать триггер по неизменяемым атрибутам, вы можете вручную инициировать событие, например, Backbone, или переопределить метод set, например, предложенный @Loamhoof.

1

У меня возникла эта проблема, когда я установил существующую модель и присвоил другой объект, имеющий те же ключи и значения. Это был другой объект, но модель не вызывала событие «изменения». Итак, для этой проблемы я использовал такое решение: я устанавливал атрибуты для модели в «тихом» режиме, после чего я запускал «change» -event для определенного атрибута. , например.

this.model.set({currentPage: page, 
       currentPanel: panel}, {silent:true}); 
this.model.trigger('change:currentPanel'); 
+0

Слушатели событий изменения ожидают '(model, value, options)' в качестве параметров. Таким образом, триггер должен быть 'this.model.trigger ('change: currentPanel', this.model, panel, {silent: true});' –

Смежные вопросы