0

考慮這個打字稿類(但我不認爲打字稿是相關的問題,不是模糊的根本defineProperty電話等):如何獲得淘汰賽以更新定義的屬性?

class Model 
{ 
    public TeamId: number; 

    constructor() 
    { 
     var self = this; 

     ko.track(this); 

     ko.getObservable(this, "TeamId").subscribe(function (newValue) 
     { 
      var o = ko.getObservable(self, "link"); 
      o.valueHasMutated(); 
     }); 
    } 

    get link(): string 
    { 
     return `/blah/blah/team/${this.TeamId}`; 
    } 
} 

請注意,我使用映射插件。

link屬性使用當前的TeamId爲該團隊建立合適的鏈接。我的問題是:如何告訴淘汰賽,當TeamId屬性發生變化時,link屬性也會發生變化?我認爲subscribe回調會做到這一點,但getObservable返回null。我想這是因爲它不適用於用defineProperty定義的屬性。但現在我卡住了,因爲我想使用這個語法,但不能使它工作。

回答

0

我會說你應該使鏈接計算。

ko.defineProperty(this, 'link', function() { 
    return `/blah/blah/team/${this.TeamId}`; 
}); 

這樣,它應該自動更新,因爲您創建了對TeamId的依賴關係。

0

當我想要使用屬性獲取器/設置器時,我所做的就是將它們與私有備份可觀察字段一起使用。通過這種方式,它可以將觀測值隱藏到外部,但是您仍然可以在內部使用標準觀測值來訂閱。

private _property = ko.observable('myValue'); 
get property(): string { 
    return this._property(); 
} 
set property(value:string) { 
    this._property(value); 
} 

在你的情況,你可以結合起來,與一個計算處理自動更新的價值,我現在看到你正在使用的插件ES5這也解釋了ko.getObservable()ko.track()調用,因此所計算的只是看起來像一個常規功能。我不能方便地測試了這一切,但看看這你想要做什麼:

class Model 
{ 
    public TeamId: number; 

    constructor() 
    { 
     var self = this;  
     ko.track(this); 
    } 

    get link(): string 
    { 
     return this.getLink(); 
    } 

    private getLink(){ 
     return `/blah/blah/team/${this.TeamId}`; 
    } 
} 
+0

根據我目前的解決方法,我認爲這會工作,但不得不做出這樣一個後盾功能它是一種缺憾爲每一個屬性。這種做法大部分都有*屬性的目的。 –

+0

那裏沒有參數。您可能想要打開另一個ES5特定的問題,以查看是否有更好的方法。 –