如何更新已定义的属性?

时间:2017-03-07 18:25:01

标签: knockout.js knockout-mapping-plugin knockout-es5-plugin

考虑这个打字稿类(但我不认为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定义的属性。但现在我被卡住了,因为我想使用这种语法,但无法使其正常工作。

2 个答案:

答案 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}`;
    }
}