如何更新 emberjs 数组以便#each 听到更改?

How to update emberjs arrays so #each hears the changes?

如果要插入控制器属性数组或从数组中移除控制器属性,如何让 Each 更新有很多问题。很简单,只需使用 Ember 内置的 MutableArrayMixin 并执行 pushObject 和 removeObject。

但是,如果数组元素是对象,那么如何以某种方式更新对象属性,以便 #each 中的任何 htmlbar 都知道它必须重新呈现自己?

例如,假设我有一些条件 CSS 属性基于 #each.

中的过滤器隐藏

我试过将对象转换为 Ember.Objects 并使用它们的 set/get,但这并没有解决问题。

这是一些示例代码。我想通过 jsbin 向您展示,但无法 https://emberjs.jsbin.com/nobozazazu/edit?html,js,console,output 工作

// within my component
export default Ember.Component.extend({
  items: function() {
    // some AJAX call to retrieve items from provided list of itemIds
    $.get('https://api.guildwars2.com/v2/items', {ids: itemIds.join(',')}).then(function(data) {
      for(var item = 0; item < data.length; item ++) {
        data[item] = Ember.Object.create(data[item])
        data[item].set('count',itemsToCount[data[item].id]);
        data[item].set('hiddenCSS', '');
        itemIdsWithData.push(data[item]);
      }
      this.set('itemData', itemIdsWithData);
    }
  }.property('itemIds'),

  filteredItems: function() {
    var selectedItem = this.get('selected');
    var itemData = this.get('itemData');

    for (var i = 0; i < itemData.length; i++) {
      if (selectedItem !== '' && selectedItem !== null && selectedItem.name === itemData[i].name) {
        itemData[i].hiddenCSS = '';
      }
      else {
        itemData[i].set('hiddenCSS', 'hidden');
      }
    }
    itemData.setObjects(itemData);

    // Verified both in Ember Inspector and with this log that itemData is changed
    console.log(itemData);
    // selected is provided from a top level route
  }.observes('selected')
})

来自我的组件模板 即使 ember 检查员验证 item.hidden 已更改,class 并未反映在 html

{{#each itemData as |item|}}
  <div class="col-md-3 icon {{item.hidden}}">
    <img class="picture-icon" src= {{item.icon}} alt="Logo"> {{item.name}} x {{item.count}}
  </div>
{{/each}}

请注意,我使用的是版本

Ember 检查员 1.8.2 Ember 1.13.3 Ember 数据 1.13.5 jQuery 1.11.3

TLDR:如果您正在使用 Ember #each,则需要使用 MutableArray 函数,例如 pushObject 和 removeObject。如果您希望 Ember 注意到对象的更改,您需要在数组中使用 Ember.Object 对象并使用 .get 和 .set 执行 sets/gets。

您似乎没有读取模板中的正确值。

您的 JavaScript 设置 hiddenCSS 属性:

itemData[i].set('hiddenCSS', 'hidden');

但是您的模板读取 hidden 属性:

<div class="col-md-3 icon {{item.hidden}}">

试试这个:

<div class="col-md-3 icon {{item.hiddenCSS}}">

此外,如果您尝试直接设置属性,Ember.Objects 将会出错。确保使用集合。

例如,而不是:

itemData[i].hiddenCSS = ''

itemData[i].set('hiddenCSS', '')