наблюдатель компонента ember js не работает

У меня есть сценарий в компоненте emberjs, где наблюдение не попадает. Я выяснил причину: «компонент еще не вставлен, когда установлено наблюдаемое свойство компонента».

У меня есть вопрос: можно ли с этим лучше справиться в ember js?

Лучшее объяснение можно найти в приведенных ниже файлах jsbin.

Не работает сценарий

Рабочий сценарий


person wallop    schedule 06.01.2015    source источник
comment
Чего именно вы пытаетесь достичь здесь? В этом сценарии обе функции наблюдателя лучше использовать в качестве вычисляемого свойства (через Ember.Computed).   -  person awgreenarrow08    schedule 06.01.2015
comment
Согласен, наблюдатели излишни в обеих ситуациях.   -  person Kingpin2k    schedule 07.01.2015
comment
Как я уже упоминал в комментариях, это был пример, а не фактический вариант использования. Фактический вариант использования был огромным, и я подумал о том, чтобы упростить его. По сути, в наблюдателе много вычислений, и это не просто назначение его другому свойству. Также, когда вы говорите, что обе функции наблюдателя будут лучше использоваться в качестве вычисляемого свойства, если вы используете вычисляемое свойство в компоненте, это не будет работать по той же причине, почему наблюдатель не работает   -  person wallop    schedule 07.01.2015
comment
Вы должны задать себе вопрос: почему я вычисляю что-то, что не будет использоваться. Если оно будет использоваться, почему я не использую вычисляемое свойство?   -  person Kingpin2k    schedule 07.01.2015
comment
@ Kingpin2k может быть, я правильно понял вашу точку зрения, но я чувствую, что тоже плохо объяснил. Приведенный пример - это всего лишь пример, а не фактический вариант использования, который я получаю! Я вычисляю что-то, что используется, но я вычисляю более одного. Поскольку я вычисляю более одного, я решил, что лучше использовать наблюдателей, чем вычисляемые свойства!   -  person wallop    schedule 07.01.2015


Ответы (1)


Вы можете указать .on('init'), чтобы заставить наблюдателей запускаться сразу после инициализации; в противном случае, как упоминалось @Kingpin2k - они не работают

App.TextboxDisplayComponent = Ember.Component.extend({
  displayText: '',        

  boundProperty: '',

  observeBoundProperty: function () {
    this.set('displayText', this.get('boundProperty'));        
  }.observes('boundProperty').on('init')
});

Ваш (не)рабочий пример здесь

person Kalman    schedule 06.01.2015
comment
именно то, что я хотел, спасибо. Когда я пробовал это, я думал, что наблюдатель получит удар только ('init') и не попадет, когда произойдут обычные изменения. Теперь я проверил это, и это происходит даже при изменении - person wallop; 07.01.2015
comment
Однако я только что понял, почему я не использовал эту концепцию раньше, здесь есть одна загвоздка! наблюдатьBoundProperty будет выполняться при инициализации, даже если boundProperty не изменен. Если бы я хотел, чтобы наблюдатель попадал только при изменении, то это не сильно помогло бы :) Но, тем не менее, я мог бы иметь внутри него проверку условий и, самое главное, его гораздо более чистую версию! - person wallop; 07.01.2015