2011-12-20 3 views
6

Когда меня изменяет «chartModel», я хочу обновить «globalModel».Сделать Backbone.js Изменение модели «частично» беззвучно?

chartModel.bind("change", updateGlobalModel); 

updateGlobalModel(){ 
    globalModel.set(obj) 
} 

И наоборот, я хочу, чтобы мой chartModel обновлялся при изменении globalModel.

globalModel.bind("change", updateChartModel); 

updateChartModel(){ 
    chartModel.set(obj) 
} 

Это приводит к циклу обратной связи при настройке globalModel. Я мог бы предотвратить это, установив {silent: true}.

Но здесь возникает проблема. У меня есть другая модель, которая зависит от события изменения:

globalModel.bind("change", updateOtherModel); 

Как предупредить эту модель изменения, но не бывшие один (чтобы избежать петли обратной связи)?

UPDATE:
На данный момент, я решил сформировать конкретный идентификатор для каждого набора вызова:

set : function(attrs, options) { 
     if(!("setID" in attrs)){ 
      attrs.setID = myApp.utils.uniqueID(); //newDate.getTime(); 
     } 
     Backbone.Model.prototype.set.call(this, attrs, options); 
    }, 

Таким образом, я всегда могу генерировать «SETID» атрибут из любого места в моем заявление. Если идентификатор setID остается неизменным при извлечении чего-либо из модели, я знаю, что может возникнуть риск для цикла обратной связи.

ответ

0

Мои знания ограничены, поэтому, возможно, я не должен отвечать, но я бы попытался передать ссылку на chartModel, когда он создан, и ссылается на «другую» модель, которую вы хотите обновить. Затем активируйте событие updateChartModel() и убедитесь, что ваша «другая» модель связана с этим событием.

Вопрос, который у меня есть: отключает ли молчащий все события? Или просто связанные с моделью? Очевидно, что это не сработает, если все события будут отключены.

+0

Спасибо за ваше предложение - я попробую, если мое обходное решение не удастся (я обновил свой вопрос.) – dani

1

Лучше поздно, чем никогда ..

Самый простой способ сделать это с помощью флага. Например, при настройке в globalModel вы также можете изменить свойство модели, чтобы указать, что вы что-то изменили. Затем вы можете проверить значение этого флага в updateChartModel. Например:

chartModel.bind ("change", updateGlobalModel);

function updateGlobalModel() { 
    if (!flag) { 
     globalModel.set(obj); 
     flag = true; 
    } 
} 

Возможно, очень похоже на то, что вы закончили с вашим идентификатором setID. В стороне, подчеркивание имеет встроенную функцию uniqueId.

Еще одна вещь, которую вы можете сделать, что намного чище, - это передать опцию с помощью вызовов ваших наборов.

chartModel.set(obj, { notify : false }); 

Да, вы можете передавать любые параметры, которые вы хотите, вы не ограничены только { silent : true }. См. this discussion on github для получения дополнительной информации. Затем проверить наличие этого свойства, где вы обрабатывать события изменений следующим образом:

function updateGlobalModel(model, options){ 
    // explicitly check for false since it will otherwise be undefined and falsy 
    // you could reverse it.. but I find this simpler 
    if (options.notify !== false) { 
     globalModel.set(obj) 
    } 
} 

и в вашем третьем (и других моделях), вы можете просто отказаться от этой проверки.

Последний вариант - это, конечно, посмотреть на ваш дизайн. Если эти две модели настолько тесно связаны друг с другом, что их необходимо синхронизировать друг с другом, возможно, имеет смысл объединить их функциональность. Кроме того, вы можете разделить общую функциональность. Все это сильно зависит от вашей конкретной ситуации.

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