2011-04-14 18 views
9

Grałem z KnockoutJS i absolutnie uwielbiam, jak bardzo upraszcza to projektowanie pod każdym kątem, utrzymując rzeczy przed upadkiem przez szczeliny. Moje pytanie brzmi: jaka jest zalecana "najlepsza praktyka" do zapisywania danych z powrotem na serwer? Rozumiem, że w podłączonej MVVM pierwszym "M" jest warstwa danych, a więc śledzenie zależności i powiadomienia w wyzwalaczu ViewModel zapisuje się bezpośrednio z powrotem do warstwy danych. W aplikacji JavaScript jesteśmy odłączeni i selektywnie zapisujemy z powrotem na serwerze przy użyciu AJAX.Najlepszy sposób na zapisanie zmian w aplikacji sieciowej MVVM/Knockoutjs?

Aplikacja, w której aktualnie go używam to MVC3 i absolutnie mam pomysł, jak napisać akcję "Zapisz" na moim kontrolerze, umieść przycisk "Zapisz" gdzieś na mojej stronie, opublikuj cały ViewModel do tej akcji Zapisz a następnie utrzymywać to w bazie danych. Ale co powiesz, kiedy dokonasz szybkiej edycji, a następnie zapiszesz ją ponownie? A co, jeśli przycisk zapisu nie pasuje do przepływu projektu? Zamiast tego chcesz publikować w akcji za każdym razem, gdy zmiana jest wprowadzana w formularzu bez żadnego przycisku zapisu? Pomysły, które odniosłem, to:

  • Przesyłaj cały ViewModel za każdym razem, gdy wprowadzane są zmiany, i spraw, aby Action figurowała jako nowa, a co nie (nie jest idealna, szczególnie dla dużych modeli, jeśli nic inaczej, ponieważ dane transmitowane przy każdym zapisie byłyby niepotrzebnie duże).
  • Dodaj właściwość do każdej pozycji w ViewModel, która śledzi, czy jest nowa i/lub zmieniona od czasu ostatniego zapisu. Następnie, poszukaj tych elementów i opublikuj tylko te na serwerze (nie testowałem tego, ale zakładam, że można to zrobić za pomocą właściwości _destroy, zgodnie z przeznaczeniem dla aplikacji Rails).
  • Należy oddzielić na tyle mniejszych modeli ViewModels, ile jest prawdopodobne, aby jakikolwiek ból z pierwszych dwóch opcji był zminimalizowany (prawdopodobnie należy to zrobić niezależnie).
  • Jakiś inny lepszy sposób?

Mam nadzieję, że istnieje kilka dobrych pomysłów, o których nie pomyślałem. Aby móc deklaratywnie wiązać wszystko i nadal skutecznie oszczędzać byłby świetny.

+0

Jesteś utożsamiając MVC (jak w ASP.NET MVC) i MVVM. Oba są w zasadzie tym samym wzorcem, ale MVVM ma zmiany specyficzne dla projektowania przeciwko aplikacjom WPF. – Will

+0

Właściwie KnockoutJS (http://knockoutjs.com) wykorzystuje wzorzec MVVM, który jest również tym, o czym mówił plakat. –

+0

Niesamowite pytanie!To samo pytanie bez Knockout byłoby być może jeszcze bardziej przydatne, ponieważ jest to jedna z wielu, wielu frameworków JS. Będę kontynuować poszukiwania dla odpowiedzi na to pytanie. – noocyte

Odpowiedz

0

Jedyna rzecz, o której mogłem pomyśleć to subscribing. Kiedy po raz pierwszy zacząłem czytać twój post, myślałem o flagach w/grep.

Edycja: Jeszcze lepiej, ko.utils.compareArrays wygląda obiecująco.

Here's przykład roboczych ..

Jedyną rzeczą do zrobienia jest wykrycie zmian w wartościach „zatrzymane” wartości. Jesteś na dobrej drodze.

+0

Wow. +1 za elegancką implementację i zamierzam to teraz zaznaczyć jako odpowiedź. Pytanie było bardziej teoretyczne, więc jestem pewien, że istnieją jeszcze inne metody, ale sposób, w jaki ten przykład jest ustawiony, jest geniuszem. Mimo że w tej implementacji jest jeszcze przycisk zapisywania, fajna część nie musi być. Tak długo, jak coś wyzwala ko.utils.compareArrays, możesz "wybiórczo publikować tylko te tablice, na których ci zależy. Dokładnie to mnie interesowało. Dobra robota. Dzięki za wkład. – Jorin

+0

cieszę się, że mogę pomóc. –

+3

Przykładowy link jest zepsuty ... czy przypadkiem ten przykład jest nadal dostępny? Mam viewmodel, który ma kilka poziomów relacji i szukam różnych opcji zapisywania – littlechris

5

Właśnie wróciłem z Mix11, gdzie uczestniczyłem w this session o Knockout.js. Może warto poświęcić chwilę, aby obejrzeć Steve'a Sandersona, który przekopuje pełne demo CRUD.

+3

Tak, faktycznie oglądałem tę mistrzowską demówkę w zeszłym tygodniu, jak tylko została opublikowana online. Naprawdę świetne demo, które pokazuje, co Knockout może zrobić po stronie klienta, ale kiedy wysłał na serwer, nie zrobił nic poza przekazaniem go z powrotem do klienta, aby pokazać, że faktycznie trafił na serwer. Bardziej interesuje mnie najlepsza praktyka podczas zapisywania przyrostowych zmian na serwerze ... przy jednoczesnym zachowaniu niewielkiej ładowności i wydajności kontrolera. – Jorin

Powiązane problemy