【问题标题】:How do I define a knockout binding handler in typescript?如何在打字稿中定义敲除绑定处理程序?
【发布时间】:2013-04-18 17:18:52
【问题描述】:

我通常通过在 JavaScript 中添加自定义 knockout binding handlers

ko.bindingHandlers.myBindingHandler = {...}

但现在我必须通过

将它们添加到 TypeScript
ko.bindingHandlers["myBindingHandler"] = {...}

否则我会收到此错误,因为我使用的是typescript.d.ts

“KnockoutBindingHandlers”类型的值上不存在属性“myBindingHandler”

我不喜欢["property"] 方法,因为这样我就无法引用它或稍后获得智能感知。

那么,如何在使用 definitelyTyped's knockout definition 时将自定义绑定处理程序添加到淘汰赛,同时还能够通过智能感知等引用我的定义?

【问题讨论】:

    标签: knockout.js typescript definitelytyped


    【解决方案1】:

    定义自定义绑定处理程序

    实际上非常简单,只需在定义自定义绑定处理程序之前将其 (myBindingHandler) 添加到KnockoutBindingHandlers 接口请注意,您必须在 1.0 版(或更早版本)的 .d.ts 文件中对界面进行此添加。

    bindingHandlers.d.ts

    /// <reference path="typings/knockout/knockout.d.ts" />
    
    interface KnockoutBindingHandlers {
        myBindingHandler: KnockoutBindingHandler;
    }
    

    myBindingHandler.ts

    /// <reference path="bindingHandler.d.ts" />
    
    ko.bindingHandlers.myBindingHandler = {...}
    

    现在一切正常。这不会覆盖任何现有的定义或声明,因此您的定义将位于ko.bindingHandlers.text 等旁边。

    请小心,因为如果您没有包含 myBindingHandler 的实际定义并且您在其他地方引用它,由于您添加到 KnockoutBindingHandlers 的定义,它将编译,但它会在运行时中断,因为没有myBindingHandler的实现。

    在 knockoutjs 中添加自定义绑定处理程序的文档是 here

    使用 fn 通过 TypeScript 添加自定义函数

    同样,要向ko.observable.fn 添加一些内容,您可以在 typescript 中执行此操作

    interface KnockoutObservableFunctions  { 
        myFnExtension(args: any): returnType; 
    }
    

    并用

    调用它
    // x will be defined as a returnType automatically, but you could specify it if you like, either way
    var x: returnType = ko.observable("value").myFnExtension(args);
    

    注意:subscribableobservableobservableArraycomputed 类型有不同的接口:

    • ko.subscribable.fn ...添加到KnockoutSubscribableFunctions
    • ko.observable.fn ...添加到KnockoutObservableFunctions
    • ko.observableArray.fn ...添加到KnockoutObservableArrayFunctions
    • ko.computed.fn ...添加到KnockoutComputedFunctions

    在 knockoutjs 中添加到 fn 的文档是 here

    【讨论】:

    • 将接口添加到与新处理程序相同的文件对我不起作用(TS 0.9.5,VS2013),但将其添加到单独的 *.d.ts 文件中:@987654323 @
    • 你可以使用 myBindingHandler: KnockoutBindingHandler;而不是 myBindingHandler: {};
    • 更新此答案以获取来自此类似问题的信息:stackoverflow.com/questions/15862086/…
    【解决方案2】:

    你可以简单地忽略它,但这不是一个好习惯,通过转换为any你没有定义属性myBindingHandler的类型

    (<any>ko.bindingHandlers).myBindingHandler = { ... };
    

    【讨论】:

      【解决方案3】:

      另一种忽略任何类型检查的肮脏方式:

      let bindingHandlers: any = ko.bindingHandlers;
      bindingHandlers.myHandler = {...}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-06
        • 1970-01-01
        • 2012-12-06
        相关资源
        最近更新 更多