2014-01-22 2 views
5

Я хочу запустить некоторый код представления, когда модель, с которой связано представление, будет изменяться.Ember.js - наблюдатель модели зрения дважды срабатывает

мой взгляд имеет наблюдателя на модели контроллера, например, так:

App.SomeView = Em.View.extend 
    modelDidChange: (()-> 
    # do stuff 
).observes('controller.model') 

При изменении модели, modelDidChange называется дважды.

Почему?

Есть ли лучший/отличный способ достичь того, что я пытаюсь сделать здесь?

Использование Ember 1.3.0.

+0

Вы нашли решение проблемы. У меня такая же проблема. Любая помощь приветствуется – Ben

ответ

0

Вы уверены, что ваше мнение должно знать, когда модель изменится? Шаблон представления получает свои свойства от контроллера и должен автоматически обновляться при их изменении. Вы, конечно, хотите избежать любых наблюдателей, если сможете.

Но я не знаю много о вашем случае использования, поэтому, предполагая, что это необходимо, я бы попробовал debouncer. Вероятно, модель не меняется дважды, событие просто запускается дважды. У Ember есть много действий, которые происходят между пользовательскими крючками, поэтому модель, вероятно, просто устанавливается на одно и то же значение дважды. Используйте debouncer, чтобы ваш метод вызывался только один раз.

+0

Да, это нечетный вариант использования. Мне нужно разгрузить/загрузить swf (не спрашивать) об изменении модели. Проверка debouncing now ... – stubotnik

+0

Документация для события 'didInsertElement' говорит, что она срабатывает после повторной визуализации представления. Возможно, что представление повторно отображается каждый раз, когда модель изменяется. Если это так, это будет идеальный сценарий для вас (наряду с событием 'willDestoryElement'). Возможно, попробуйте выполнить быстрый тест, чтобы увидеть, изменит ли модель модель. – GJK

+0

К сожалению, нет. didInsertElement срабатывает только один раз. мое представление постоянно отображается в приложении, поэтому я предполагаю, что повторный рендеринг здесь не применяется – stubotnik

0
Ember.beginPropertyChanges(); 
    # model updates 
Ember.endPropertyChanges(); 
0

В первый раз это срабатывает, потому что вы сделали изменения в вашем браузере, и что изменение отправляется в хранилище данных Ember, который вызывает функцию обратного вызова наблюдателя. Затем хранилище делает запрос update на бэкэнд, который отвечает обновленной моделью, когда в магазине получена эта обновленная модель, она снова вызывает обратный вызов наблюдателя.

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