Question Pourquoi faut-il déballer une valeur de liaison dans knockoutjs?


J'ai remarqué que dans KnockoutJS, la liaison de valeur ne fonctionnait pas si elle était annulée:

ainsi:

data-bind="showTip: enableTip, css: { disabled: !addButtonEnabled }"

ne prend pas correctement en compte la variable addButtonEnabled négative.

Cependant, cela fonctionne:

data-bind="showTip: enableTip, css: { disabled: !addButtonEnabled() }"

Pourquoi est-ce que cela doit être déballé, où l'autre ne le fait pas?

J'utilise knockout 1.2.1.


10
2018-02-23 10:10


origine


Réponses:


Laissez-moi vous expliquer un peu comment KO analyse les liaisons dans votre exemple.

En fait, la liaison de données contient du JSON. KO l'enveloppe avec des symboles {} et évalue le code JS normal. Dans votre exemple, KO a cet objet après évaluation:

{
    showTip: enableTip,
    css: { disabled: !addButtonEnabled }
}

css bindingHandler reçoit la liaison de nœud doit être appliquée à et la fonction bindingAccessor.

Après évaluation de cette fonction, nous obtenons un "argument" pour css contraignant. qui est égal à objecter

{ disabled: !addButtonEnabled }

alors css bindingHandler parcourt les propriétés de cet objet pour définir les styles correspondants. Quand cela vient à disabled propriété nous devons lire la valeur pour elle.

En général, toutes les liaisons standard lisent la valeur de cette manière: ko.utils.unwrapObservable(value) qui retourne value si value n'est pas observable ou la valeur stockée dans cette variable observable.

Dans ton cas value = !addButtonEnabled. Comme vous pouvez le voir !addButtonEnabled est une expression JavaScript, non observable. Donc, il évalue juste cette expression. Donc, en fait, votre bouton est toujours activé depuis observable() != false.

Dans votre deuxième cas, la valeur à évaluer contient la valeur d'observable, donc elle fonctionne correctement.

je pense que tu


15
2018-02-23 10:25