1

考虑这个打字稿类(但我认为打字稿与问题无关,除了掩盖底层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. 但现在我被卡住了,因为我想使用这种语法但不能让它工作。

4

2 回答 2

0

我会说你应该计算链接。

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

这样它应该会自动更新,因为您创建了对 TeamId 的依赖项。

于 2017-03-07T18:50:28.683 回答
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()andko.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}`;
    }
}
于 2017-03-07T19:30:56.433 回答