knockout.js - observablearray - ¿Por qué negar un valor de enlace en knockoutjs tiene que ser desenvuelto?
ko observable(); (1)
Permítanme explicarles un poco cómo los enlaces KO parse en su ejemplo.
De hecho, el enlace de datos contiene JSON. KO lo envuelve con {} símbolos y lo evalúa como código JS normal. En su ejemplo, KO obtuvo este objeto después de la evaluación:
{
showTip: enableTip,
css: { disabled: !addButtonEnabled }
}
css
bindingHandler receive node binding se debe aplicar ay bindingAccessor function.
Después de la evaluación de esta función obtenemos un "argumento" para el enlace css
. que es igual a un objeto
{ disabled: !addButtonEnabled }
Luego css
bindingHandler recorre las propiedades de este objeto para establecer los estilos correspondientes. Cuando se trata de propiedades con disabled
, debemos leer su valor.
Por lo general, todas las vinculaciones estándar leen el valor de esta manera: ko.utils.unwrapObservable(value)
que devuelve el value
si el value
no es observable o el valor almacenado en esta variable observable.
En su caso value = !addButtonEnabled
. Como puede ver !addButtonEnabled
es una expresión de JavaScript, no observable. Entonces solo evalúa esta expresión. De hecho, su botón siempre está habilitado ya que observable() != false
.
En el segundo caso, el valor que se evaluará contiene el valor de observable para que funcione correctamente.
creo que usted
Me he dado cuenta de que en KnockoutJS ese enlace de valor no funciona si se niega:
al igual que:
data-bind="showTip: enableTip, css: { disabled: !addButtonEnabled }"
no recoge correctamente la variable addButtonEnabled negada.
Sin embargo, esto funciona:
data-bind="showTip: enableTip, css: { disabled: !addButtonEnabled() }"
¿Por qué es que esto tiene que ser desenvuelto, mientras que el otro no?
Estoy usando knockout 1.2.1.