【问题标题】:TypeScript, Knockout and ClassesTypeScript、淘汰赛和类
【发布时间】:2017-07-07 13:11:11
【问题描述】:

在我的打字稿文件中,我试图有一个可观察的类,它包含我所有的 UI 相关字段,然后我可以获取并发布到服务器。我将它放在我的视图模型之外,因为我想将我发布的字段与所有其他视图模型项分开。

所以,在我的打字稿文件中,首先,我创建了我的 UI 模型。

interface Model {
    id: KnockoutObservable<number>;
}


class MyViewModel {

    model: KnockoutObservable<Model>;

    constructor() {

    $.get("/api/debt/1")
        .done((data) => {
            this.model().id(data.ID);
        }); 
    }

}

这不起作用。由于某种原因,“this.model”是未知的。

我正在尝试做的事情是否可能?我做错了什么?

编辑:简化为仅使用 id 属性。使用接口,而不是类。在 this.model().id(data.ID) 上失败,因为“模式不是函数”。现在不知道如何初始化模型。

【问题讨论】:

    标签: javascript asp.net-web-api knockout.js


    【解决方案1】:

    您已经定义了模型应该是什么,它是一个“KnockoutObservable”类型的对象,但是您实际上还没有创建任何东西来填充变量,所以它的值仍然是未定义的。

    尝试将model: KnockoutObservable&lt;Model&gt;; 替换为

    model: KnockoutObservable<Model> = ko.observable(new Model());
    

    编辑 1:

    此外,您还需要通过添加括号来更改下面的分配以解决未装箱模型的属性而不是可观察对象本身:

        this.model().id = ko.observable(0);
        this.model().description = ko.observable("");
        this.model().openingBalance = ko.observable(0);
        this.model().standardRate = ko.observable(0);
    

    编辑2:

    如果您在回调中使用 lambda 表达式而不是标准函数声明,Typescript 将保留“this”的上下文。

    $.get("/api/debt/1")
            .done((data) => {
                 this.model().id(data.ID);
            }); 
    

    您可能还希望将新值分配给“id”可观察对象的现有实例,而不是替换可观察对象。如果你覆盖了它绑定的 observables,Knockout 的依赖跟踪将不起作用。因此,您可以像函数一样使用 observable,而不是使用赋值运算符 (=)。

    编辑 3:

    这里有一个更完整的例子:

    class Model {
        id: KnockoutObservable<number>;
    }
    
    
    class MyViewModel {
    
        model: KnockoutObservable<Model> = ko.observable(new Model());
    
        constructor() {
    
          this.model().id = ko.observable(0);
    
          $.get("/api/debt/1")
            .done((data) => {
                this.model().id(data.ID);
            }); 
        }
    
    }
    

    【讨论】:

    • 谢谢!在我的 .done 中,在我完成获取之后,这是正确的分配方式吗?我已经进行了您所说的更改,但是在分配时,它告诉我“TypeError:this.model 不是函数”。此外,“模型”应该是可观察的吗?我希望属性是可观察的。也许这也是一个错误?
    • 我认为下面的问题可能是“this”不再指代类,而是指 .done 回调函数。 Javascript 在这种情况下很奇怪。如果您将 .done 函数改为 lambda 表达式,那么 typescript 将自动继承“this”上下文。
    • 用 lambda 示例更新了我的答案。让我知道是否需要更多解释。
    • 感谢@JasonSpake...越来越近,但仍然无法正常工作。我已将“类模型”更改为“接口模型”,因为这可能更正确。然后将模型实例定义为“model: KnockoutObservable;”...然后在我的 .done 中,我试图分配像这样的值“this.model().id(data.ID);”。我将函数更改为 lambda。但是在尝试分配 id 时仍然会得到“this.model is not a function”。
    • 此时您的代码与最初发布的内容有些不同。您可以使用更新的粘贴来编辑您的问题吗?
    猜你喜欢
    • 2019-03-31
    • 1970-01-01
    • 2012-06-06
    • 2015-06-02
    • 2013-12-18
    • 2018-10-15
    • 2015-01-29
    • 2018-05-26
    • 2013-06-15
    相关资源
    最近更新 更多