2012-03-09 11 views
16

Probabilmente è meglio spiegare con un esempio. This è un esempio collegato dal blog Knockout su come utilizzare $parent. Tuttavia, in questo caso, $parent è apparentemente uguale a $root, quindi ho difficoltà a vedere il vantaggio.Posso ottenere l'array osservabile su cui sto lavorando all'interno?

Dove si dice $parent.lastUpdated, vorrei invece accedere alla matrice osservabile, this.products. Mi rendo conto che potrei dire $root.products. Tuttavia, mi piacerebbe generalizzare questo, piuttosto che scriverlo esplicitamente per ogni lista.

Lo userò effettivamente in combinazione con ko.contextFor.

risposta

27

Non è possibile accedere (in modo generico) all'array observable che viene collegato direttamente all'interno del ciclo foreach.

$root e $parent riguarda l'ambito, quindi fornirà solo l'oggetto che contiene l'ObservableArray.

Tuttavia, è possibile sfruttare questo vantaggio assicurandosi che l'ambito sia il vostro osservableArray utilizzando il binding with.

Se avete solo bisogno la matrice di fondo, allora si può fare:

<div data-bind="with: products"> 
    <ul data-bind="foreach: $data"> 
     <li> 
      <strong data-bind="text: name"></strong> 
      &mdash; 
      Array length: <em data-bind="text: $parent.length"></em> 
     </li> 
    </ul> 
</div>​ 

Se si ha realmente bisogno l'observableArray, allora avete bisogno di fare in modo che non è stato scartato (nell'esempio di cui sopra $data è già scartato). Per fare questo, è possibile normalizzare il nome della matrice e cercarlo nel modello come:

<div data-bind="with: { theArray: products }"> 
    <ul data-bind="foreach: theArray"> 
     <li> 
      <strong data-bind="text: name"></strong> 
      &mdash; 
      Array length: <em data-bind="text: $parent.theArray().length"></em> 
     </li> 
    </ul> 
</div>​ 

Ecco un esempio: http://jsfiddle.net/rniemeyer/T6JvV/

Se non si può vivere con l'extra div, poi potete certamente usare gli attacchi di controllo del flusso senza container come:

<!-- ko with: { theArray: products } --> 
    <ul data-bind="foreach: theArray"> 
     <li> 
      <strong data-bind="text: name"></strong> 
      &mdash; 
      Array length: <em data-bind="text: $parent.theArray().length"></em> 
     </li> 
    </ul> 
<!-- /ko --> 
+0

Grazie, sia per l'informazione che non può essere fatto, sia per il "con" work-around. –

+0

C'è un problema "minore" con questo (soluzione 1 che usa "con" sull'array osservabile) .. Il "con" causa il ridisegno della struttura del bambino (dovevo sovrascrivere la logica di "con" per evitare questo ma fuori la scatola credo che questo sia il modo in cui funziona sulla mutazione dell'osservabile - come con if) che porta a qualsiasi elemento non vincolato da ripristinare - potresti aver bisogno di pannelli di bootstrap, ad esempio, che non sono vincolati. Sto cercando di capirlo - magari impostando una variabile di contesto $ padre che viene clonata quando viene creato il contesto figlio in modo che $ context ['myContextualArrayId'] sia lì .. –

Problemi correlati