考虑这个打字稿类(但我不认为Typescript与问题相关,除了模糊底层的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 :(得分:0)
我会说你应该把链接计算出来。
ko.defineProperty(this, 'link', function () {
return `/blah/blah/team/${this.TeamId}`;
});
这种方式应该自动更新,因为您在TeamId上创建了一个依赖项。
答案 1 :(得分:0)
当我想使用属性getter / setter时,我所做的是将它们与私有后备可观察字段一起使用。这样它将observable隐藏到外部,但你仍然可以在内部访问标准的observable来订阅。
private _property = ko.observable('myValue');
get property(): string {
return this._property();
}
set property(value:string) {
this._property(value);
}
在您的情况下,您可以将其与计算结合使用以自动处理值更新,现在我看到您正在使用解释ko.getObservable()
和ko.track()
调用的ES5插件,因此计算只是看起来像常规函数。我无法轻易测试所有这些,但看看这是否符合您的要求:
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}`;
}
}