2010-11-10 4 views
18

Sto lavorando con i gruppi Google sui forum di Knockout anche per questo, ma immagino che un pubblico più vasto non possa mai danneggiare la situazione.Knockoutjs con jQuery UI Sortable

Sto cercando di far funzionare KO con una situazione usando il plugin 'Sortable' di jQuery UI. Ho il mio codice pubblicato qui.

http://www.pastie.org/1285716

Il tentativo di utilizzare un binding personalizzato ...

 ko.bindingHandlers.onReceiveItem = { 
      init: function (element, valueAccessor, allBindingsAccessor, viewModel) { 
       $(element).bind("sortreceive", function (event, ui) { 
        ko.bindingHandlers.onReceiveItem.update(element, valueAccessor, allBindingsAccessor, viewModel); 
       }); 
      }, 
      update: function (element, valueAccessor, allBindingsAccessor, viewModel) { 
       var value = ko.utils.unwrapObservable(valueAccessor()); 
       var bindings = allBindingsAccessor(); 
      } 
     }; 

L'obiettivo è che quando l'elenco ordinabile riceve un elemento, si può ottenere l'oggetto e aggiungerlo agli altri observableArray.

Questo non è proprio funzionante per me, però. Sto avendo difficoltà a far sparare l'evento come lo voglio. Il modo in cui l'ho impostato, si attiva, ma restituisce solo un valore "vero/falso". Speravo che qualcun altro potesse avere un'idea di cosa sto facendo male e so come risolverlo.

(utilizzare il codice, è necessario fare riferimento

<link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.6/themes/base/jquery-ui.css" rel="Stylesheet" /> 

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.6/jquery-ui.js"></script> 

in alto, e poi l'ultima versione di Knockout (1.1.1)

http://cloud.github.com/downloads/SteveSanderson/knockout/knockout-1.1.1.debug.js

+0

[https://github.com/rniemeyer/knockout-sortable](https://github.com/rniemeyer/knockout-sortable) Knockout.js 2.0 questa è una grande implementazione. – Joe

risposta

10

non l'ho fatto rendi conto Steve had already answered this prima che avessi finito. Ecco, però, un modo leggermente diverso da lui.

Sortable rende questo molto più difficile, questo woul d è stato molto più facile con un binding drag-and-bound associato a ciascun prodotto. Il problema con ordinabile è che si sta vincolando all'intero elenco invece degli elementi.

http://www.pastie.org/1432093

+0

Grazie, e devo ringraziare anche Steve. Non ho mai ricevuto una e-mail a cui aveva risposto, quindi ho pensato che fosse appena finito sul ciglio della strada. Credo di aver dimenticato di iscrivermi alla discussione.Questo esempio è eccessivamente utile e mi farà risparmiare molto tempo in quello che devo fare con esso. – Ciel

+0

Va notato che questa era una soluzione KO 1.0 e da allora molte cose sono cambiate. Ryan Niemeyer ha rivisitato il post di ordinamento KO 2 in questo [solido plugin] (http://www.knockmeout.net/2012/02/revisiting-dragging-dropping-and.html) – madcapnmckay

16

ho rielaborato il campione e viene fornito con un bindingHandler quasi completo, non richiede un attributo id e gestisce anche riordino. Ecco il codice:

http://jsbin.com/knockoutsortable/20/edit

utilizzo:

  • Sta usando il legame per scoprire che cosa è la matrice associata nel ViewModel template.foreach.

  • È possibile utilizzare databind = "foreach: Prodotti, ordinabile: true" per abilitare l'ordinamento all'interno di un singolo array senza opzioni.

  • Funziona con oggetti ObservableArray.

  • Sta costruendo il jQuery ordinabile da solo, è possibile passare lo stesso oggetto opzioni nell'associazione rispetto al costruttore jQuery.sortable.

+1

Questa è un'ottima risposta. Sono stato in grado di usarlo per modificare l'ordinamento per un array osservabile a eliminazione diretta aggiungendo il seguente dopo la chiamata newArray.splice: $ (viewModel.items()). Each (function (index) { \t var newSortOrder = index + 1; \t var thisItem = viewModel.items() [indice]; \t thisItem.sortOrder (newSortOrder); }); – Reaction21

+0

@ Guillaume86 Sfortunatamente la tua soluzione non funziona con Knockout> v3.1.0 Gli elementi scompaiono di apparire due volte durante l'ordinamento – RHAD

+0

@Richard scusa Sono passato ad angolare alcuni anni fa non uso più il knockout – Guillaume86