2012-03-02 6 views
18

¿Hay una manera que puedo llamar a la función de JavaScript en los datos-se unen de esta manera:Knockout.js - función javascript en datos-bind

<span id="lblSomePropVal" data-bind="text: MySomeFunction(SomeProperty())" ></span> 

lo que estoy tratando de hacer es MySomeFunction llamada con el valor de SomeProperty de mi modelo de vista. My SomeFunction devolverá un texto basado en el valor pasado y que se mostrará en el span lblSomePropVal.

Lo probé de la manera que he escrito en el ejemplo pero arroja un error de encuadernación.

¿Me falta algo aquí o hay alguna otra forma de hacerlo?

Este es el error que estoy recibiendo:

Microsoft JScript runtime error: Unable to parse bindings. 
Message: [object Error]; 
Bindings value: text: MySomeFunction(SomeProperty()) 
+0

probar 'data-bind = "text: MySomeFunction.bind (SomeProperty())" ' – sll

+0

trataron. no funciona. – Asdfg

Respuesta

12

usted puede utilizar arbitraria expre JavaScript para las vinculaciones, pero tenga en cuenta que se evalúan en el contexto del modelo de vista, por lo que todas las funciones en la expresión tienen que ser propiedades del modelo de vista. En su caso, MySomeFunction tiene que ser una propiedad de su modelo de vista. Si crea su modelo de vista usando el plugin de mapeo, puede adjuntar funciones adicionales al modelo de vista así:

var viewModel = ko.mapping.fromJS(data.d) 
viewModel.MySomeFunction = function(...){...}; 
+0

Lamento molestarlo, pero sigo recibiendo 'MySomeFunction' no está definido? –

+0

También sigo recibiendo "no está definido" cuando uso este método. – svante

+0

tiene que calificar completamente de lo contrario no se puede ver ... asumiendo que está dentro de una biblioteca o módulo – Clarence

5

Bueno, yo sólo voy por el tutorial, pero yo pensé que había que establecer una propiedad y uso ko.computed para darle su valor (de el tutorial):

function AppViewModel() { 
this.firstName = ko.observable("Bert"); 
this.lastName = ko.observable("Bertington"); 
this.fullName = ko.computed(function(){ 
    return this.firstName() + " " + this.lastName(); 
    },this); 
} 

, entonces puede tener:

Full name: <strong data-bind="text: fullName"></strong> 
+1

Sé que esto se puede hacer, pero me preguntaba si puedo llamar a una función JS en el atributo de enlace de esa manera no tengo que escribir muchos códigos JS para manipular cada propiedad – Asdfg

+0

Peter está aquí. Puedes construir tu función dentro de tu viewmodel y funcionará. Por ejemplo, si MySomeFunction estaba dentro de AppViewModel arriba, podría llamarlo muy bien. Además, puede utilizar elementos básicos de Javascript como '.toUpperCase()' dentro del enlace de datos – deltree

+0

. Creo que esto no funciona porque mi función está fuera del modelo de vista. Estoy usando el mapeador knockout para declarar mi viewmodel (var viewModel = ko.mapping.fromJS (data.d);). ¿Cómo adjunto una función a mi modelo de vista debajo de eso? – Asdfg

12

tuve un problema similar tratando de calcular entradas de las celdas de la tabla. Lo que funcionó para mí fue incluida 'MySomeFunction' en mi modelo de datos, y luego los datos de unión a las células de mi mesa como:

<td data-bind="text: $root.MySomeFunction(SomeProperty)"></td> 
+3

Y si aún tiene problemas, intente '' para asegurarse de que $ root tenga las propiedades que espera. –

1

he logrado hacer esto utilizando el contexto. Si necesita todo el código, puedo enviárselo.

<h2 class="text" data-bind="html: currentProgram($context)"></h2> 

function currentProgram(context){ 
    var title = '<font size="1">' + context.$data.name + '</font>'; 
    return title; 
} 

También tendrá que configurar esta

 $.ajaxSetup({ 
      async: false 
     }); 
0
<div style="font-size:18px;float:left;width:95%" data-bind="html: trimString(AccountName,25)"></div> 

function trimString(value, maxLen) { 

    //Return undefined, and short strings 
    if (value === undefined) return undefined; 
    if (value.length < maxLen) return value; 

    return value.substring(0, (maxLen - 1));  
} 
Cuestiones relacionadas