TL; DR/Solución rápida
Ejecute observableArray
como una función para obtener la matriz subyacente, luego obtener su longitud:
<!-- ↓↓ -->
myObsArray's length is: <span data-bind="text: myObsArray().length"></span>
¿Por qué sucede esto?
Permítanme ofrecer una respuesta que proporciona algunos detalles, además de @kendaleiv's solution, y que también responde a una pregunta muy relacionadas siento que muchas personas tienen:
Por qué hace myObsArray.length
siempre de retorno 0 (cero)?
A repro típico de tal escenario sería la siguiente:
ko.applyBindings({ myObsArray: ko.observableArray(["one", "two", "three"]) });
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
myObsArray.length = <span data-bind="text: myObsArray.length"></span>
El fragmento dice "longitud = 0", en lugar de "longitud = 3".
La clave a tener en cuenta aquí: ko.observableArray
es una función ...que devuelve una función.
Así es: si se asigna el resultado de la misma a una variable o miembro, como en el ejemplo myObsArray
, esa variable será una referencia a una función. Así que si usted está pidiendo
myObsArray.length
continuación, en realidad estás pidiendo the Function.length
property: el número de argumentos que la función de toma. Para una función devuelta desde ko.observableArray
, esta será 0 (cero).
¿Cómo lo solucionamos?
La corrección dada en otras respuestas está bien, permítanme reiterar aquí con el ejemplo de esta respuesta. Para obtener la longitud de "observándose la matriz", es necesario invocan dicha función para obtener la matriz, y continuación obtener su longitud:
ko.applyBindings({ myObsArray: ko.observableArray(["one", "two", "three"]) });
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
myObsArray.length = <span data-bind="text: myObsArray().length"></span>
último Como nota al pie, el código de OP es algo equivalente a:
myObsArray.length()
Esto encontrará la propiedad Function.length mencionada anteriormente e intentará ejecutarla como una función (que no es), y no devolverá 0 sino que se bloqueará. Tenga cuidado de no invocar length
como una función, pero el observable. Invoque siempre length
como una variable miembro.
Will/Can/¿Se puede cambiar esto?
Desde el principio, los desarrolladores de KO consideraron este problema; ya en Github issue no 4. Ese problema explica las cosas que he intentado cubrir arriba también, y también muestra que al final no había mucho que se pudiera hacer para cambiarlo.
Guau, no puedo creer que no haya visto eso. Gracias por la ayuda. –
Mira esto: http://jsfiddle.net/TuRrs/5/, agregó un enlace personalizado 'currencyText' si estás interesado. – kendaleiv
Muchas gracias, lo comprobaré. –