当对象(字典)更改时,如何重新呈现?

8zzbczxx  于 2022-10-20  发布在  其他
关注(0)|答案(1)|浏览(164)

我有以下的.hbs

<button {{action "addToObject"}}>
    Add to Object
</button>

<br />

{{#each this.sortedDictionary as |item|}}
    {{item.name}}<br />
{{/each}}

以及对应的.js代码:

import Component from '@ember/component';
import EmberObject, {set, computed, observer} from '@ember/object';

export default Component.extend(
{
    myDictionary: null,
    counter: 0,

    init()
    {
        this._super( ...arguments );

        console.log( "test-comp init" );

        this.myDictionary = {};

        set( this.myDictionary, "hello", "42" );
    },

    sortedDictionary: computed( 'myDictionary', function()
    {
        let sortedDictionary = [];

        if ( this.myDictionary ) 
        {
            const keys = Object.keys( this.myDictionary );

            keys.sort();

            console.log( "test-comp keys", keys );

            sortedDictionary = keys.reduce( ( sorted, itemName ) => 
            {
                const value = 
                {
                    name: itemName,
                    ...this.myDictionary[ itemName ]
                }

                sorted.push( value );

                return sorted;
            }, []);
        }

        console.log( "test-comp sortedDictionary", sortedDictionary );

        return sortedDictionary;
    }),

    actions:
    {
        addToObject()
        {
            set( this.myDictionary, `hello${this.counter}`, "42" );

            this.counter++;

            console.log( "test-comp addToObject", this.myDictionary );
        }
    }
});

在我看来,当我按下添加到对象按钮时,我的.hbs应该重新呈现。但事实并非如此。
我假设这是因为sortedDictionary未重新计算,无法检测到myDictionary*已更改。
这个问题的正确解决方案是什么?

slhcrj9b

slhcrj9b1#

在embercomputed函数中,唯一的依赖项是myDictionary。因此computed将只触发对myDictionary对象的引用更改。您可以通过调用字典事件更改或添加另一个依赖项(在您的示例中,counter)来调整这一点。如果将counter用作计算属性的依赖项,则必须使用set函数来触发依赖项更改。
除此之外,hbs不需要使用this来获取myDictionary,因为它使用相关组件作为上下文

相关问题