2013-06-03 16 views
54

Ostatnio zastanawiałem się nad różnicami i podobieństwami między Backbone.js i AngularJS.Używanie modeli szkieletowych z AngularJS

To, co uważam za naprawdę wygodne w kręgosłupie to modele kręgosłupa i kolekcje kręgosłupa. Trzeba tylko ustawić urlRoot, a następnie komunikacja z serwerem zaplecza za pośrednictwem Ajax w zasadzie działa.

Czy nie powinno być możliwe stosowanie tylko modeli szkieletowych i kolekcji w aplikacji AngularJS? Mamy więc najlepsze dwukierunkowe wiązanie danych z AngularJS i wygodny dostęp do serwera (lub innych opcji pamięci masowych) za pośrednictwem modeli i kolekcji szkieletowych.

Szybkie wyszukiwanie w internecie nie spowodowało pojawienia się witryny sugerującej ten scenariusz użycia. Wszystkie zasoby mówią o używaniu jednej lub drugiej struktury.

Czy ktoś ma doświadczenie z używaniem modeli szkieletowych lub kolekcji z AngularJS. Czy nie będą się dobrze uzupełniać? Czy czegoś mi brakuje?

+8

Dlaczego chcesz użyć szkieletowy modele, masz $ zasobu w kątowe, które mogą bardzo łatwo zintegrować z modeli po stronie serwera bezpośrednio za pomocą REST –

+0

Spróbuj grać z modeli i kolekcji z Kręgosłup. Ze względu na wsparcie dla podkreślenia jest bardzo uzależniające. Myślę, że jednym z głównych problemów z tym ng-Back będą problemy z eventami z getterami i setterami. –

+4

Jak to się stało? Czy to działa? –

Odpowiedz

4

Prawidłowe pytanie na pewno.

Wiele ograniczeń z bieżącą implementacją zasobu $, który między innymi nie posiada wewnętrznego zarządzania kolekcjami, takiego jak Backbone.Collection. Po napisaniu własnej warstwy kolekcji/zarządzania zasobami w kanciastych (przy użyciu $ http, a nie zasobu $), teraz widzę, czy mogę zastąpić wiele elementów wewnętrznych dla kolekcjonowania szkieletów i modeli.

Do tej pory część pobierania i dodawania jest bezbłędna i zapisuje kod, ale powiązanie tych modeli szkieletowych (lub atrybutów wewnątrz, raczej) z modelami ng na wejściach do edycji jeszcze nie działa.

@ericclemmons (GitHub) uczynił to samo i mam dwa dobrze ożenić - Zapytam go, dostać moją pracę testową, a zakładać zawarcie ...

+2

Czy zrobiłeś postępy w tej sprawie? – bjunix

+3

Jak to się stało? –

+0

Jakieś postępy w tej sprawie? Byłbym bardzo wdzięczny, gdyby to zadziałało. – thejava

7

Zastanawiałem się, czy ktoś miał zrobił to również. W mojej najnowszej/pierwszej kanciastej aplikacji znalazłem Angulara, który ma dość brak modeli i kolekcji (chyba że coś mi oczywiście brakuje!). Oczywiście możesz pobierać dane z serwera za pomocą $ http lub $ resource, ale co jeśli chcesz dodać niestandardowe metody/właściwości do swoich modeli lub kolekcji. Załóżmy na przykład, że masz kolekcję samochodów i chcesz obliczyć całkowity koszt. Coś takiego:

z kolekcją Backbone, byłoby to dość łatwe do wdrożenia:

carCollection.getTotalCost() 

ale w kątowe, to prawdopodobnie masz zawinąć metodę niestandardową w służbie i przekazać swoją kolekcję to, tak:

carCollectionService.getTotalCost(carCollection) 

Podoba mi się podejście do kręgosłupa, ponieważ w moim odczuciu jest czystsze. Jednak uzyskanie dwukierunkowego powiązania danych jest trudne. Sprawdź ten przykład JSBin.

http://jsbin.com/ovowav/1/edit

Podczas edycji numerów, collection.totalCost przyzwyczajenie aktualizować ponieważ właściwości car.cost nie dostają ustawić poprzez model.set().

Zamiast tego, zasadniczo użyłem swoich własnych konstruktorów/"klas" dla modeli i kolekcji, skopiowałem podzbiór API szkieletu z Backbone.Model and Backbone.Kolekcja i zmodyfikował moje niestandardowe konstruktory/klasy, aby działała z powiązaniem danych Angular.

+1

Myślę, że jest to odpowiedź na problem, z którym się spotkasz:) http://jsbin.com/ivumuz/2/edit – Roylee

+0

W zależności od tego, z kim rozmawiasz, punkt usługi jest odciągnięcie logiki do przetwarzania danych. Kontroler odpowiada wtedy za dekorację widoku. W takim przypadku należy umieścić logikę do analizowania, sortowania, przekształcania danych w ten kontroler. – deadbabykitten

11

grupę roboczą wiążące dla powyższego przykładu ... http://jsbin.com/ivumuz/2/edit

to pokazuje drogę do pracy około Szkieletowymi Modele z angularjs. ale połączenie seterów/pobierających byłoby lepsze.

+0

Myślę, że jest to odpowiedź na odpowiedź skaterdav85 – bjunix

+0

słodki przykład @tenphi –

9

miał podobny pomysł w głowie i wpadł na ten pomysł: Dodaj tylko getter i setter na zawsze modelu atrybutu.

Backbone.ngModel = Backbone.Model.extend({ 
     initialize: function (opt) { 
     _.each(opt, function (value, key) { 
      Object.defineProperty(this, key, { 
       get: function() { 
        return this.get(key) 
        }, 
       set: function (value) { 
        this.set(key, value); 
       }, 
       enumerable: true, 
       configurable: true 
      }); 
     }, this); 
    } 
}); 

Zobacz skrzypce: http://jsfiddle.net/HszLj/

2

Zastanawiałem się o takim samym

Jest to use-case:

Salesforce mobilnych SDK (hybrydowe) jest funkcja o nazwie smartstore/SmartSync , który oczekuje modeli szkieletowych/kolekcji, które zostaną zapisane w pamięci lokalnej w celu uzyskania dostępu w trybie offline.

Zgadłeś, że to prawda, chcemy użyć angularjs dla reszty aplikacji hybrydowej.

Ważne pytanie.

-Sree

2

Należy spojrzeć na boilerplate angularjs z parse here. Parse ma szkielet, ale nie jest dokładnie kręgosłupem. Ów, gdzie im rozpoczynające mój pomysł projektu angularjs backbone.js

Powiązane problemy