2012-03-03 21 views
36

Estoy intentando crear una matriz de líneas de pedido por contrato (CLIN) que se mostrarán como elementos individuales div debajo de un encabezado de información general del contrato.¿Cómo obtener una longitud observable de Array?

Puedo hacer funcionar las observaciones normales, pero parece que el paso de la matriz a través del constructor para el modelo de vista no crea ninguna parte de la matriz observable de clins.

Tengo jsFiddle that illustrates my problem. Lo que me resulta extraño es que data-bind="text: clins.length() en la etiqueta HTML span no devuelve cero, sino que no muestra nada.

¿Hay alguna forma de habilitar la depuración dentro de un jsFiddle o debería ver una advertencia/error?

Respuesta

67

Los errores de las páginas jsfiddle se envían a su navegador.

En cuanto a su error, intente lo siguiente:

<span data-bind="text: clins().length"> 

Esto convierte el observableArray en un array y utiliza la propiedad de la matriz length.

Ver el updated the jsfiddle as well.

+0

Guau, no puedo creer que no haya visto eso. Gracias por la ayuda. –

+1

Mira esto: http://jsfiddle.net/TuRrs/5/, agregó un enlace personalizado 'currencyText' si estás interesado. – kendaleiv

+0

Muchas gracias, lo comprobaré. –

5

Para cualquier persona que quiera obtener la longitud de un observableArray sin los _destroy artículos ed, puede utilizar esta función:

ko.observableArray.fn.totalVisible = function() { 
    var items = this(), count = 0; 

    if (items == null || typeof items.length === "undefined") { 
     return 0; 
    } 

    for (var i = 0, l = items.length; i < l; i++) { 
     if (items[i]._destroy !== true) { 
      count++; 
     } 
    } 

    return count; 
}; 

después utilizarla:

myObservableArray.totalVisible(); 
+0

Bueno, me van a presentar éste para más tarde. utilizar. Gracias. :-) –

16

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.lengthsiempre 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.

Cuestiones relacionadas