2012-01-20 11 views
42

Patrzę na Ember.js i czytałem dokumenty, aby spróbować i zrozumieć, jak z niego korzystać. Rozumiem (całkiem dobrze), z wyjątkiem jednej rzeczy. Na swój sposób myślenia w schemacie MVC, Model jest repozytorium dla danych w aplikacji. Widzę, jak to działa dla danych po stronie klienta w Ember.js. Czego nie dostaję, to jak powiązać te dane z powrotem z serwerem, aby zmiany danych na kliencie były aktualizowane na serwerze. I wzajemnie. Robiłem to przez moje aplikacje webowe, które wywoływały połączenia Ajax/JSON z serwerem, a ja po prostu nie rozumiem, jak to zrobić za pomocą Ember.js.ember.js i serwer

Odpowiedz

51

kopanie po prostu nieco wokół emberjs on GitHub Znalazłem to: https://github.com/emberjs/data:

Ember danych jest biblioteką do ładowania modeli z warstwą trwałości (takich jak JSON API), aktualizowanie tych modeli, a następnie zapisywanie zmiany. Zapewnia wiele udogodnień, które można znaleźć w serwerowych ORMach, takich jak ActiveRecord, ale został zaprojektowany specjalnie dla unikalnego środowiska JavaScript w przeglądarce.

Proponuję również przeczytać Ember.js Live Collections. Co chcesz to mieć kolekcję modeli, które będą wiedzieć, jak zsynchronizować ze strony serwera, możliwe jest przykładowy kod:

// our model 
App.Person = Ember.Object.extend(); 

App.people = Ember.ArrayController.create({ 
    content: [], 
    save: function() { 
    // assuming you are using jQuery, but could be other AJAX/DOM framework 
    $.post({ 
     url: "/people", 
     data: JSON.stringify(this.toArray()), 
     success: function (data) { 
     // your data should already be rendered with latest changes 
     // however, you might want to change status from something to "saved" etc. 
     } 
    }); 
    } 
}); 

Byłbyś wtedy zadzwonić App.people.save() na potrzebnymi okazjach.

Warto również zapoznać się z tym artykułem, Advice on & Instruction in the Use Of Ember.js, który zawiera więcej informacji na temat komunikacji serwer-klient z Emberem, a także wspomina o emberjs/data.

Uwaga: Biblioteka danych Emberjs powinna być używana z ostrożnością, ponieważ nie jest gotowa do produkcji.

+1

Dziękuję za wspaniałą odpowiedź, bardzo pomocna, a artykuł, do którego się odwołujesz, będzie dla mnie przydatny. W pewnym sensie sposób, w jaki Ember.js jest używany po stronie klienta, przypomina schemat Mediator/Colleague, który jest przydatny do zarządzania zmianami w oknach dialogowych GUI. Powyższe wskazówki pomogą mi połączyć takie rzeczy, aby zsynchronizować serwer/klienta. Jeszcze raz, wielkie dzięki! –

+0

Nie sądzę, że dane ember powinny zostać wprowadzone do użytku, ponieważ wyraźnie wskazuje, że jest to część PRACA W POSTACI i PODCZAS RAPIDU ROZWOJU dla emberjaków. Myślę, że stabilna alternatywa będzie świetna. –

+0

@Random link do trek jest zdecydowanie cenne, ma link do starej wersji artykułu, który jest bardzo edukacyjny i daje ludziom pomysł, jak wykonać komunikację klient-serwer w ember. Oddanie go. –

6

W Ember.js "model" zawarty w obiekcie Ember będzie zawierał dodatkową abstrakcję bazy danych po stronie serwera, jeśli jest używana. Część kontrolera aplikacji powinna wtedy mieć metody, które pozwalają na pobieranie i wysyłanie danych, które są wywoływane w razie potrzeby w celu zaktualizowania modelu (przy użyciu Ajax). Jest to miłe, ponieważ masz model, który może szybko reagować po stronie klienta na dowolne dane wejściowe, które użytkownik dostarcza aplikacji (naciśnięcia klawiszy, ruchy myszą, cokolwiek) i wybiórczo wybrać, kiedy wykonać relatywnie kosztowne zapytania do bazy danych po stronie serwera. W ten sposób część wydajności aplikacji nie jest już utrudniana przez opóźnienie żądań danych na serwer zewnętrzny, co w niektórych przypadkach pozwala na tworzenie aplikacji, których czas reakcji zbliża się do aplikacji natywnych.

+7

DOM to dokument Model obiektowy i odnosi się zwykle do reprezentacji drzewa elementów HTML (lub XML) i jej API. W modelu Ember.js z całą pewnością nie jest przechowywany w DOM i nie jest to dobry pomysł na przechowywanie danych w DOM - DOM jest najwolniejszą częścią API przeglądarki JavaScript. Możesz prawdopodobnie przechowywać wiązania w DOM (np. Knockout.js), ale nie sam model. Dlatego właśnie w tej chwili następuje zmiana z jQuery - aby nie przechowywać samego stanu danych i danych w DOM. –

+0

@gryzzly - dowolny artykuł/dyskusja odwołuje się do DOM wolniej i problemów z jQuery? – theringostarrs

+0

Być może do użytku, jQuery i DOM są w porządku! Kiedy po raz pierwszy przeczytałem opis BackboneJS: "Podczas pracy nad aplikacją internetową, która wymaga dużej ilości skryptów JavaScript, jedną z pierwszych rzeczy, których się uczysz, jest zaprzestanie wiązania danych z DOM.Zbyt łatwo jest tworzyć aplikacje JavaScript, które kończą się splątanymi stosami selektorów i wywołań zwrotnych jQuery, a wszystkie starają się szybko zsynchronizować dane między interfejsem HTML, logiką JavaScript i bazą danych na serwerze. W przypadku bogatych aplikacji klienckich bardziej ustrukturyzowane podejście jest często pomocne. "Dopasował dokładnie moje myśli. –

5

Lubię wyobrazić ember.js parami tak

  • widoki i szablony są skorelowane (oczywiście), Wykręcanie widokowe Class kontrolować szablon (jak classnames)
  • Router i Trasy działa trochę jak kontroler w MVC. Są odpowiedzialni za skierowanie żądania do właściwego punktu końcowego. Sterownik i model są zorientowane na model, jeden (model) opisuje dane, które będą obsługiwane w aplikacji, podczas gdy kontroler zachowuje się jak rodzaj proxy (lub dekoratora, jeśli to jest więcej w twojej uliczce).Szablony będą podłączane do kontrolera i na przykład:

Zasadniczo oznacza to, że ładujesz swój kontroler (pojedynczy lub macierz) na model i możesz teraz łatwo modelować procesy działające na tym modelu (tj. Rzeczy, które nie dotknij modelu w jego rdzeniu/danych) w kontrolerze. W przypadku aplikacji bloga przykład opisałbyś Posta się w modelu i dodać coś takiego kontrolera

App.PostController = Ember.ObjectController.extend({ 
    content: null, 

    // initial value 
    isExpanded: false, 

    expand: function() { 
    this.set('isExpanded', true) 
    }, 

    contract: function() { 
    this.set('isExpanded', false) 
    } 
}); 

Teraz można współdziałać z represenation modelu pod względem frontend myślenia poprzez kontroler . Rozszerzanie wpisu nie zmienia modelu, zmienia się tylko zmiana danych.

Pod względem przeładunku danych z serwera, mam dwie odpowiedzi dla ciebie

  1. znalazłem this article bardzo pomocne w zrozumieniu połączenia (odpytywanie i prosty, aczkolwiek proste)
  2. Jeśli używasz szyny, dostaniesz szczęście z nadchodzących Rails 4 na żywo, zobacz this post and demo dla soczyste części
1

Zdaję sobie sprawę, że jest to nieco stary z pytaniem, ale to jest na najwyższym oceniane strony dla ember.js, więc pomyślałem, że dodam trochę.

Ostatnio używałem ember-model do obsługi wiązania danych RESTful. Ma mniej dzwonków i gwizdów, ale dla moich potrzeb jest całkiem przyzwoity. Zasadniczo, po prostu rozszerza funkcjonalność modelu, aby dobrze zintegrować się z serwerem przesuwającym obiekty JSON za pośrednictwem standardowego interfejsu REST.