knockout.js - knockoutjs - ko observable();
¿Cómo se define un controlador de enlace nocaut en mecanografiado? (3)
Definición de un controlador de enlace personalizado
De hecho, es bastante fácil, solo myBindingHandler
( myBindingHandler
) a la interfaz KnockoutBindingHandlers
justo antes de definir tu controlador de enlace personalizado . Tenga en cuenta que debe hacer esta adición a la interfaz, dentro de un archivo .d.ts
partir de la versión 1.0 (o posiblemente antes).
bindingHandlers.d.ts
/// <reference path="typings/knockout/knockout.d.ts" />
interface KnockoutBindingHandlers {
myBindingHandler: KnockoutBindingHandler;
}
myBindingHandler.ts
/// <reference path="bindingHandler.d.ts" />
ko.bindingHandlers.myBindingHandler = {...}
Ahora todo funciona. Esto no sobrescribirá las definiciones o declaraciones existentes, por lo que su definición se ubicará junto a ko.bindingHandlers.text
, etc.
Solo tenga cuidado, porque si no incluye una definición real de myBindingHandler
y la referencia en otro lugar, se compilará debido a la definición que agregó a KnockoutBindingHandlers
, pero se interrumpirá en tiempo de ejecución porque no hay implementación de myBindingHandler
.
La documentación para agregar manipuladores de encuadernación personalizados en knockoutjs está aquí
Usando fn para agregar funciones personalizadas con TypeScript
Del mismo modo, para agregar algo a ko.observable.fn
, harías esto en mecanografiado
interface KnockoutObservableFunctions {
myFnExtension(args: any): returnType;
}
y llámalo con
// 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);
Nota: Existen diferentes interfaces para los tipos subscribable
, observable
, observableArray
y computed
:
-
ko.subscribable.fn
... agregar aKnockoutSubscribableFunctions
-
ko.observable.fn
... agregar aKnockoutObservableFunctions
-
ko.observableArray.fn
... agregar aKnockoutObservableArrayFunctions
-
ko.computed.fn
... agregar aKnockoutComputedFunctions
La documentación para agregar a fn en knockoutjs está here
Normalmente agrego manipuladores vinculantes personalizados en JavaScript a través de
ko.bindingHandlers.myBindingHandler = {...}
pero ahora tengo que agregarlos en TypeScript través de
ko.bindingHandlers["myBindingHandler"] = {...}
de lo contrario, obtengo este error porque estoy usando typescript.d.ts :
La propiedad ''myBindingHandler'' no existe en el valor de tipo ''KnockoutBindingHandlers''
No me gusta el enfoque ["property"]
porque entonces no puedo hacer referencia a él ni obtener intelisense sobre él más adelante.
Entonces, ¿cómo puedo agregar mi manejador de encuadernación personalizado para nocaut mientras uso la definición de definición definitiva de definitionTyped , al mismo tiempo que puedo hacer referencia a mi definición a través de intellisense, etc.?
Otra manera sucia de ignorar cualquier tipo de comprobación de tipo:
let bindingHandlers: any = ko.bindingHandlers;
bindingHandlers.myHandler = {...}
simplemente puede ignorarlo , pero esta no es una buena práctica , ya que al myBindingHandler
no está definiendo el tipo de la propiedad myBindingHandler
(<any>ko.bindingHandlers).myBindingHandler = { ... };