2013-08-09 25 views
37

Twierdzę, aby dowiedzieć się AngularJS, pochodzących z wielu różnych ram MV *. Podoba mi się framework, jednak mam problem z przekazywaniem danych między kontrolerami.Przekazywanie danych między kontrolerami

Załóżmy, że mam ekran z niektórymi danymi wejściowymi (input.html) i kontrolerem, powiedzmy InputCtrl.
W tym widoku znajduje się przycisk, który przenosi użytkownika do innego ekranu, powiedzmy zatwierdzenia (approve.html) za pomocą kontrolera ApproveCtrl.
Ten parametr ApproveCtrl potrzebuje danych z InputCtrl. Wydaje się to bardzo częstym scenariuszem w większych aplikacjach.

W moich poprzednich ram MV *, byłoby to traktowane jak (pseudo-kod):

var self = this; 
    onClick = function() { 
      var approveCtrl = DI.resolve(ApproveCtrl); 
      approveCtrl.property1 = self.property1; 
      approveCtrl.property1 = self.property2; 
      self.router.show(approveCtrl); 
    }    
  • To będzie działać jak Controller pierwszy. Najpierw utworzysz kontroler, mając szansę, aby umieścić go w prawidłowym stanie; następnie tworzony jest widok.

Teraz w angularjs, jestem obsługi to tak:

var self = this; 
onClick = function(){ 
      self.$locationService.path('approve');  
} 
  • Działa to podobnie jak widok pierwszego. Mówisz, do którego widoku/trasy nawigujesz, kontroler jest tworzony przez framework.

Trudno jest kontrolować stan utworzonego kontrolera i przekazywać do niego dane. widziałem i próbowałem następujące podejścia, ale wszystkie mają swoje własne problemy moim zdaniem:

  1. wstrzyknąć Shared Service w InputCtrl & ApproveCtrl i umieścić wszystkie dane, które mają być udostępniane na tej usługi
    • to wygląda jak brudna praca; stan w udostępnionej usługi staje się stan globalnej, podczas gdy po prostu trzeba go przekazać dane do ApproveCtrl
    • Żywotność tej wspólnej służby jest sposób dłużej, niż to, czego potrzebuję go - wystarczy przekazać dane do ApproveCtrl
  2. przekazać dane w $ routeParams
    • to robi się dość niechlujny kiedy posiadające przepustkę wiele parametrów
  3. użyć $ zakres zdarzeń
    • Con ceptually, nie jest to coś, w czym bym użył zdarzeń - po prostu muszę przekazać dane do ApproveCtrl, nic zdarzenia - jest to
    • To jest dość uciążliwe; Muszę wysłać zdarzenie do rodzica pierwsze, które następnie transmitowane go to dzieci

Am I brakuje czegoś tutaj? Czy tworzę zbyt wiele małych kontrolerów? Czy staram się trzymać za bardzo nawyków z innych struktur?

+0

Chciałbym pójść z 3 według twoich potrzeb. Usługa służy do przesyłania danych między kontrolerami, którzy muszą udostępniać dane, a nie głównie do stanów. Również rozwiązanie 2 jest znacznie prostsze, ale parametry trasy staną się kłopotliwym problemem w miarę ich wzrostu. –

+0

Trzecia opcja to właściwa droga. –

+0

Czy zamierzasz zaakceptować odpowiedź XLII, linki były kopalnie złota, jak był schemat. –

Odpowiedz

56

Pod względem struktury AngularJS jest bardziej modułowy niż MVC.

Klasyczne MVC opisuje 3 proste warstwy, które współdziałają ze sobą w taki sposób, że Sterownik przeszywa Model z Widokiem (i Model nie powinien raczej pracować z Widok bezpośrednio lub odwrotnie).

kątowej można mieć wiele, niektóre całkowicie opcjonalne, podmioty, które mogą wchodzić w interakcje między sobą na wiele sposobów, na przykład:

Possible Interactions

Dlatego istnieje wiele sposobów komunikowania swoich danych pomiędzy różnymi podmioty. Można:

lub

  • Wysyłaj wiadomości za pomocą backendu AJAX
  • Wysyłanie wiadomości za pomocą systemu zewnętrznego (np MQ)

... i wiele więcej. Ze względu na swoją różnorodność Angular pozwala programistom/projektantom wybierać sposób, w jaki są najbardziej wygodni i czynią to dalej. Polecam lekturę AngularJS Developer Guide, gdzie można znaleźć błogosławione rozwiązania niektórych typowych problemów.

+2

Dzięki za szczegółową odpowiedź; Wiem, że jest kilka opcji w AngularJS, zastanawiałem się, jak większość ludzi radzi sobie z tym, co uważam za typowy scenariusz. – KoenJ

+3

To jest wspaniała i szczegółowa odpowiedź, ale myślę, że używanie ** usługi ** jest najlepszą opcją: http://stackoverflow.com/questions/20181323/passing-data-between-controllers-in-angular-js – Jess

+1

Ten wykres! Natychmiast wyślę to do moich kolegów! – Aspelund

8

Jeśli Twoim zamiarem jest po prostu udostępnianie danych między dwoma widokami, usługa jest prawdopodobnie drogą do zrobienia. Jeśli jesteś zainteresowany utrzymywaniem w magazynie danych, możesz rozważyć jakąś usługę typu back-end, taką jak REST API. Spójrz na usługę $ http.

3

Nawet jeśli XLII dał pełną odpowiedź, znalazłem ten samouczek za pomocą usługi. Jest to bardzo interesujący i prosty sposób na udostępnianie danych między kontrolerami za pomocą właściwości wiążącej 2 sposoby: https://egghead.io/lessons/angularjs-sharing-data-between-controllers

Nadal nie korzystałem z niej na razie.

W przeciwnym razie istnieje również ten inny sposób, na podstawie wydarzeń: http://www.objectpartners.com/2013/08/21/using-services-and-messages-to-share-data-between-controllers-in-angularjs/

1

Jeśli chcesz przekazać prosty ciąg danych z jednej strony (Strona1) do innej strony (Strona2), jednym z rozwiązań jest użycie tradycyjnych parametrów URL . Wywołaj URL strony 2 z parametrem takim jak "/ strona2/param1/param2". Sterownik strony 2 otrzyma parametry w "routeParams". Będziesz mieć dostęp do parametrów jako routeParams.param1 i routeParams.param2.Poniższy kod jest przyjęty od: How to get the url parameters using angular js

powołać się na trasie STR.2 z kontrolera (js) Strona1 lub adresu URL w swojej HTML z parametrami jak: trasy

"/page2/param1/param2" 

STR.2:

$routeProvider.when('/page2/:param1/:param2', { 
    templateUrl: 'pages/page2.html',  
    controller: 'Page2Ctrl' 
}); 

I kontroler:

.controller('Page2Ctrl', ['$scope','$routeParams', function($scope, $routeParams) { 
    $scope.param1 = $routeParams.param1; 
    $scope.param2 = $routeParams.param2; 
    ... 
}]); 

Teraz możesz uzyskać dostęp do parametrów (param1 i pa ram2) w html/template twojej strony2.

Powiązane problemy