Ember.JS强制计算属性重新计算

omhiaaxx  于 2022-11-05  发布在  其他
关注(0)|答案(1)|浏览(168)

因此,我在Ember应用程序中有一个计算属性,声明为myComProp: computed('itemTrait', function () {...})。myComProp属于一个项目模型。在一个单独的组件(listItem)中,我有一个myComProp的别名属性:myAlias: alias('itemModel.myComProp')。现在listItems是listItems数组的成员,其属性在web应用中呈现。
现在,由于该属性是一个别名,是否有一种方法可以强制计算的属性重新计算?
我尝试过将别名设置为跟踪属性,但这样做会将调用堆栈作为字符串返回,而不是计算函数的实际结果。
更新
增加这一点以便更好地解释。

// itemModel.js
export default parentModel.extend({
   //irrelevant properties

   myComProp: computed('itemTrait', function() {
       // logic
   })
});

在其他地方有两个组件,一个是页面中呈现itemModel列表的部分,另一个是itemModel的表示(由list组件从数据存储中获取)

// itemModelRep/component.js
export default Component.extend({
    // other properties

    myAlias('item.myComProp')
    // itemModel is represented in the list by 'item'
});

还有名单:

//itemList.js

export default parentDisplay.extend({
    // other properties

    get items() {
        // this is what is used as the list items
        // it basically gets a list of items from the itemModel record set in
        // the data store

        listOfItems.forEach((item) => {
             // Other stuff going on
             // Here I want to force the property to recompute
        };
    }
});

基本上,myComProp会获取一个相关日期,当我用一个新条目更新列表时,我希望重新计算相关日期。

mi7gmzs6

mi7gmzs61#

让我看看我是否理解你的问题:

// app/models/item.js

myComProp: computed('itemTrait', function () {...});

// app/components/list-item.js

itemModel: null, // passed in

myAlias: alias('itemModel.myComProp'),

listItems: null,

init() {
  this._super(...arguments);
  this.listItems = [this.itemModel];
}

actions: {
  changeItem() {
    this.itemModel.itemTrait = 'new value';
  }
}

changeItem被调用时,itemModel.itemTrait会发生变化,而listItems并不表达这些变化?
如果是这样的话,问题就不是你的计算属性或别名没有更新,而是列表不知道它需要更新。
快速解决方案:

actions: {
  changeItem() {
    this.itemModel.itemTrait = 'new value';
    this.notifyPropertyChange('listItems');
  }
}

以下是有关notifyPropertyChange的一些信息:https://api.emberjs.com/ember/3.20/classes/Component/methods/notifyPropertyChange?anchor=notifyPropertyChange
如果我误解了您的问题,请解释和/或更新您的问题。
此答案为Ember 3.20的最新版本

相关问题