网站搜索

knockout.js - TypeScript——比较 KnockoutObservable<number> 与 number


我正在尝试执行一个应该很简单的操作,但我遇到了一个奇怪的问题。我需要禁用一个按钮,除非某个值大于0。基本上,我的代码是这样的:

currentIndex: KnockoutObservable<number> = ko.observable<number>();
canActivate: KnockoutComputed<boolean>;

this.canActivate = ko.computed<boolean>(function ()) {
    if (this.currentIndex > 0) {
        return true;
    }
    else {return false;}
});

在这种形式下,它总是返回 false。如果我把 > 换成 !=,它总是返回 true。我有一个函数来显示 currentIndex,当我点击不同的项目时,它会像我预期的那样变化。然而,我就是无法将它与数字进行比较。有什么想法吗?谢谢!

答案#1

正如上面的海报所说,你需要同时使用箭头函数创建 canActivate 并对 observable 进行求值。类似这样:

this.canActivate = ko.computed<boolean>(() => {
    return this.currentIndex() > 0;
});

TypeScript 使用箭头函数语法来捕获 this 上下文。如果你使用 function() 创建,它的上下文不会是你期望的上下文,这就是为什么你会得到未定义函数错误的原因。

答案#2

在 Knockout 中,你需要对可观察对象进行求值才能获得它的值,这是因为可观察对象是函数。在这种情况下,要获取 currentIndex 的值,你可以这样做:

而不是:

this.currentIndex

你会做:

this.currentIndex() 

这是一个完整的工作示例:

/// <reference path="scripts/typings/knockout/knockout.d.ts" />

class Example {
    currentIndex: KnockoutObservable<number> = ko.observable<number>();
    canActivate: KnockoutComputed<boolean> = ko.computed<boolean>(() => {
        if (this.currentIndex() > 0) {
            return true;
        } else {
            return false;
        }
    });
};