web-dev-qa-db-fra.com

Knockout.js - fonction javascript sur la liaison de données

Existe-t-il un moyen d'appeler la fonction JavaScript sur Data-bind comme ceci:

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

Ce que j'essaie de faire, c'est d'appeler MySomeFunction avec la valeur de SomeProperty de mon modèle de vue. My SomeFunction retournera du texte basé sur la valeur transmise et qui sera affiché dans la plage lblSomePropVal.

Je l'ai essayé comme je l'ai écrit dans l'exemple, mais une erreur de reliure est générée.

Est-ce que je manque quelque chose ici ou y at-il une autre façon de faire cela?

C'est l'erreur que j'obtiens:

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

Vous pouvez utiliser des expressions JavaScript arbitraires pour les liaisons, mais gardez à l'esprit qu'elles sont évaluées dans le contexte du modèle de vue, de sorte que toutes les fonctions de l'expression doivent être des propriétés de modèle de vue. Dans votre cas, MySomeFunction doit être une propriété de votre modèle de vue. Si vous créez votre modèle de vue à l'aide du plug-in de mappage, vous pouvez associer des fonctions supplémentaires au modèle de vue, comme ceci:

var viewModel = ko.mapping.fromJS(data.d)
viewModel.MySomeFunction = function(...){...};
12
Roman Bataev

J'ai eu un problème similaire en essayant de calculer les entrées de cellules de tableau. Ce qui a fonctionné pour moi a été d'inclure «MySomeFunction» dans mon modèle de données, puis de lier les cellules de mon tableau en tant que:

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

Eh bien, je ne fais que parcourir le didacticiel moi-même, mais je pensais que vous deviez configurer une propriété et utiliser ko.computed pour lui donner sa valeur (extrait du didacticiel):

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

Ensuite, vous pouvez avoir:

Full name: <strong data-bind="text: fullName"></strong>
5
Peter

J'ai réussi à le faire en utilisant le contexte. Si vous avez besoin de tout le code, je peux vous l'envoyer.

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

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

Vous devrez également définir ceci

       $.ajaxSetup({
          async: false
        });
1
Dani Thomas
<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));    
}
0
Patrick