【问题标题】:Knockout Computed in TypeScript?用 TypeScript 计算淘汰赛?
【发布时间】:2014-09-18 20:59:33
【问题描述】:

概述

我只想在 TypeScript 中编写一个 Knockout Computed 函数作为原型的属性。当它不是ko.computed 时,我知道如何将函数编写为原型的属性。我知道如何将ko.computed 写为对象(但不是原型)的属性,但我似乎找不到交集的正确语法。

我想要什么(JS)

MyClass.prototype.myFunction = ko.computed(function(){

    // js goes here

});

我有什么 (TS)

myFunction():  any {

    ko.computed(function(){

        // code

     })

}

我的 TS 输出的内容(不需要)

MyClass.prototype.myFunction = function(){

    ko.computed(function(){

        // code

    })

});

TypeScript 向原型发出的表达式示例

TS

class MyClass {

    name: KnockoutObservable<string>;  

    editing: KnockoutObservable<boolean>;                    

    constructor(name: string) {

        this.name = ko.observable(fullName);

        this.editing = ko.observable(false);

    }

    edit(): void {

        this.editing(true);

    }

}

JS

var MyClass = (function () {
    function MyClass(name) {
        this.name = ko.observable(fullName);

        this.editing = ko.observable(false);
    }
    MyClass.prototype.edit = function () {
        this.editing(true);
    };
    return MyClass;
})();

如果没有办法以我描述的方式类似地编写 ko.computed,我会觉得这真的很令人费解。

【问题讨论】:

  • 您确定要这样做吗?如果您的原型 computed 值依赖于实例 observables,那么只要 any 实例中的实例值发生更改,或者可能出现更糟糕的行为,您将重新触发跨类的所有实例的计算>
  • 好点;我不想在原型上出现这个!

标签: javascript knockout.js typescript


【解决方案1】:

您可以做的是使用 observable 的 owner 属性来提供要在计算中使用的范围:

class MyViewModel {
    myFunction = () => ko.computed({
        owner: this,
        read: function() {
            // code
        }
    })
}

这将为您提供以下输出:

var MyViewModel = (function () {
    function MyViewModel() {
        var _this = this;
        this.myFunction = function () {
            return ko.computed({
                owner: _this,
                read: function () {
                    // code
                }
            });
        };
    }
    return MyViewModel;
})();

【讨论】:

    【解决方案2】:

    试试这个:

    myFunction: KnockoutComputed<string> = ko.computed(() => {
        // return any string value
     });
    

    【讨论】:

      【解决方案3】:

      TypeScript 中没有发出在原型上初始化的表达式的语法。你可以这样做:

      class Foo {
          myFunction: ko.computed<string>;
      }
      Foo.prototype.myFunction = function() {
          return 'hello' + 'world';
      }
      

      【讨论】:

        猜你喜欢
        • 2012-06-12
        • 2017-10-16
        • 1970-01-01
        • 1970-01-01
        • 2017-07-07
        • 1970-01-01
        • 1970-01-01
        • 2019-03-31
        • 1970-01-01
        相关资源
        最近更新 更多