41

私は通常、JavaScript でカスタムノックアウト バインディング ハンドラーを追加します。

ko.bindingHandlers.myBindingHandler = {...}

しかし今、私はそれらをTypeScriptに追加する必要があります

ko.bindingHandlers["myBindingHandler"] = {...}

そうしないと、 typescript.d.tsを使用しているため、このエラーが発生します。

プロパティ「myBindingHandler」は、タイプ「KnockoutBindingHandlers」の値には存在しません

["property"]後で参照したり、インテリセンスを取得したりできないため、このアプローチ は好きではありません。

では、 intelliseTyped のノックアウト定義を使用しながら、カスタム バインディング ハンドラをノックアウトに追加するにはどうすればよいでしょうか。また、インテリセンスなどを介して定義を参照することもできます。

4

3 に答える 3

54

カスタム バインディング ハンドラの定義

実際には非常に簡単で、カスタム バインディング ハンドラーを定義する直前にインターフェイスに ( myBindingHandler)追加するだけです。 この追加は、バージョン 1.0 (またはそれ以前)のファイル内で行う必要があることに注意してください。KnockoutBindingHandlers.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

ノックアウトjsにカスタムバインディングハンドラーを追加するためのドキュメントはこちら

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);

注: subscribableobservableobservableArray、およびcomputedタイプには異なるインターフェースがあります。

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

knockoutjs で fn に追加するためのドキュメントはこちら

于 2013-04-24T23:48:30.963 に答える
1

あらゆる種類の型チェックを無視する別の汚い方法:

let bindingHandlers: any = ko.bindingHandlers;
bindingHandlers.myHandler = {...}
于 2015-11-06T11:00:19.430 に答える