Javascript 数据更改时,Ember component computed函数不会重新运行

Javascript 数据更改时,Ember component computed函数不会重新运行,javascript,ember.js,Javascript,Ember.js,我在计算属性中存储了一个字符串值,如下所示: clientId: Ember.computed.oneWay("_clientId") chartData: Ember.computed("data", function () { const data = this.get("data"); const clientId = this.get("session").get("clientId"); console.log(clientId); if (dat

我在计算属性中存储了一个字符串值,如下所示:

clientId: Ember.computed.oneWay("_clientId")
chartData: Ember.computed("data", function () {
    const data = this.get("data");

    const clientId = this.get("session").get("clientId");
    console.log(clientId);

    if (data && data.get("left") !== undefined && data.get("right") !== undefined) {
        return data;
    }

    this.set("_chartDisplayData", null);
    return null;
})
其中_clientId定义为对象上的属性,如下所示:

export default Ember.service.extend { _clientId: null, clientId: Ember.computed.oneWay("_clientId"), updateId() {this.set("_clientId", "fe48822d-bf50-44a1-9ce0-61b06504d726"); } }
然后我有一个具有计算属性的组件,如下所示:

clientId: Ember.computed.oneWay("_clientId")
chartData: Ember.computed("data", function () {
    const data = this.get("data");

    const clientId = this.get("session").get("clientId");
    console.log(clientId);

    if (data && data.get("left") !== undefined && data.get("right") !== undefined) {
        return data;
    }

    this.set("_chartDisplayData", null);
    return null;
})
当我调用updateId时,我希望chartData函数在clientId的值更改时重新运行(我验证了clientId的值已更改)。然而,chartData函数从未重新运行,这是为什么

你需要告诉警察。首先,如果computed属性没有在某处使用,它将永远不会运行。如果你不使用它,你需要一个替代品。但假设您实际正在使用它,computed属性只会在列出的依赖项之一发生更改时重新计算自身。如果您将一个对象列为依赖项,则仅当该对象的某些属性发生更改时,该对象才会更新,而仅当整个对象被替换时才会更新。试试这个:

chartData: Ember.computed("data.left", "data.right", "session.clientId", function () {
    const data = this.get("data");

    const clientId = this.get("session.clientId");
    console.log(clientId);

    if (data && data.get("left") !== undefined && data.get("right") !== undefined) {
        return data;
    }

    this.set("_chartDisplayData", null);
    return null;
})

您似乎在寻找观察者,而不是计算属性。除非从某个位置(例如模板)引用
chartData
,否则计算属性逻辑不会激发。通常,在计算属性定义中,
set
是一种代码味道,可能意味着您没有正确地执行操作。