javascript - 观察者不会在组件中触发

标签 javascript ember.js

我在 Controller 中有下一个代码:

...
  selectedIngredientsIds: [],

  barItemsChanged: Ember.observer('user.barItems.[]', function() {
    let ingredients = [];
    if (this.get('user').get('barItems')) {
      ingredients = this.get('user').get('barItems').map(function(item) {
        return item.ingredientId;
      });
    }

    this.set('selectedIngredientsIds', ingredients);
  })
...

和模板:

  {{ingredient-chooser
      multiple=false
      ingredients=ingredients
      changeIngredients="changeIngredients"
      needToClear=needToClear
      placeholder="Добавить в бар..."
      selectedIngredients=selectedIngredients
      selectedIngredientsIds=selectedIngredientsIds
      ingredientSelected="ingredientSelected" }}

成分选择器组件:

...
  selectedIngredients: [],
  selectedIngredientsIds: [],

  selectedIngredientsChanged: Ember.observer('selectedIngredients.[]', function() {
    this.sendAction("changeIngredients", this.get('selectedIngredients'));
  }),

  selectedIngredientsIdsChanged: Ember.observer('selectedIngredientsIds.[]', function() {
    let self = this;
    let ingredients = this.get('selectedIngredientsIds').map(findIngredientByRealId);
    this.set('selectedIngredients', ingredients);
  })
...

barItemsChanged 观察者工作正常。 selectedIngredientsChanged 也可以正常工作。即使我检查 selectedIngredientsIds 属性,它也会显示正确的值。但由于某些原因 selectedIngredientsIdsChanged 观察者从未调用过。

我做错了什么?

最佳答案

我用下一个代码解决了问题:

Ember.run.scheduleOnce('afterRender', this, () => {
      this.set('selectedIngredientsIds', ingredients);
    });

而不是:

this.set('selectedIngredientsIds', ingredients);

我猜因为 user.barItems 是模型的一部分,所以 barItemsChanged 在组件观察者初始化之前被调用。

关于javascript - 观察者不会在组件中触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35252783/

相关文章:

javascript - 在特定条件下禁用 gridview 中的文本框

javascript - 在 jsrender 模板中定义变量

Ember.js:如何在父路由的 Controller 和子路由之间通信数据?

javascript - 重定向路线 - 什么是 ember way?

javascript - 无法循环遍历 ember 模板中的 json 响应

javascript - Handlebars 条件样式属性

javascript - 大型阵列上的 Node console.log 显示 "... 86 more items"

javascript - 在 Angular 中覆盖 Controller

javascript - 动态表单到数据库

javascript - 在 block 助手中使用 Ember 的 Handlebars #each 助手,将数组切成 block