【问题标题】:Knockout Viewmodel in Typescript打字稿中的淘汰视图模型
【发布时间】:2013-06-24 22:34:50
【问题描述】:

我们应该如何在 typescript 中声明视图模型?

作为类、模块还是作为 var/functions?

在确定类型的示例中,他们主要使用 var 和函数 https://github.com/borisyankov/DefinitelyTyped/blob/master/knockout/tests/knockout-tests.ts

编辑:谢谢 Basarat - 在此编辑中,我扩展了问题: 如果我使用类,我想应该是这样的:

class Player
{
    min:KnockoutObservable<number>;
    constructor(min:number=0)
    {
        this.min=ko.observable(min);
    }
}

但是应该如何定义计算?

【问题讨论】:

    标签: knockout.js typescript


    【解决方案1】:

    您可以将计算与泛型一起使用(最新的 Typescript 0.9),只需在声明中定义类型,在构造函数中您将为调用 ko.computed 的结果赋值:

    export class Inbox extends vm.BriskIdeaViewModel {
    
        public rapidEntryText = ko.observable<string>();
        public todosActive: KnockoutComputed<Array<ITodo>>;
    
        constructor() {
            super();
            this.todosActive = ko.computed(() => {
                return _.filter(this.dataContext.todos(), x => !x.isDone());
            });
        }
    }
    

    【讨论】:

    • 为什么要用public,为什么要在rapidEntryText的最后加上()=ko.observable()? (我知道 observables 是函数,但 VS 强调它是一个错误)
    • public 只是个人喜好 - 没有 public 也一样(typescript 默认是 public,除非你把它设为私有)。
    • 和 rapidEntryText = ko.observable();是有默认值——你可以把这个赋值与构造函数分开(比如this.todosActive),但这更容易。
    • 基本上,在我的示例中,您不能对计算进行相同操作,因为它引用了“this”,在这种情况下,您不能像使用 rapidEntryText 一样使用字段分配
    【解决方案2】:

    我更喜欢使用类,因为它们确实非常好地封装了功能。

    例如一个简单的类:

    class Player {
        min = ko.observable(0);
        sec = ko.observable(0);
        mil = ko.observable(0);
    }
    

    然后做一个简单的应用:

        var vm = new Player();
        ko.applyBindings(vm);
    

    【讨论】:

    • 我一直在等待某人(除了我 :P)用泛型对 ko 可观察对象进行建模——他们似乎是为它量身定做的。你有没有试过这个?
    • @JcFx 不。不过,我确实做了重要的通用工作:github.com/basarat/typescript-collections非常更喜欢 AngularJS 而不是淘汰赛。我所知道的所有淘汰赛现在已经一岁了 :) AngularJS 现在对我来说是第二天性 :)
    • 不要劫持你的答案,但希望增加它的用处,有人有:typescript.codeplex.com/discussions/441964
    • 谢谢,但不应该是这样的:class Player{min:KnockoutObservable constructor(min:number=0){this.min=ko.computed(min)}}跨度>
    • 更正 'ko.computed(min)'='ko.observable(min)' 还编辑了问题以反映这一点
    猜你喜欢
    • 1970-01-01
    • 2014-01-27
    • 2013-02-27
    • 2013-01-15
    • 2013-07-08
    • 2012-11-09
    • 2012-11-29
    • 2015-07-07
    相关资源
    最近更新 更多