2013-04-15 9 views
67

Mam zmienną, która będzie używana przez jeden lub więcej kontrolerów, zmienionych przez usługi. W tym przypadku stworzyłem usługę, która przechowuje tę zmienną w pamięci i udostępnia ją między kontrolerami.Zmienne wiążące z usługi/fabryki do kontrolerów

Problem polega na tym, że za każdym razem, gdy zmienna ulega zmianie, zmienne w kontrolerach nie są aktualizowane w czasie rzeczywistym.

Tworzę to skrzypce, aby pomóc. http://jsfiddle.net/ncyVK/

--- Należy pamiętać, że {{countService}} lub nigdy nie jest aktualizowany, gdy zwiększam wartość licznika.

Jak powiązać zmienną Service/Factory ze zmienną $ scope.variable w kontrolerze? Co robię źle?

Odpowiedz

115

Nie można powiązać zmiennych. Ale możesz powiązać zmienne obiekty dostępowe lub obiekty, które zawierają tę zmienną. Tutaj jest naprawiony jsfiddle.

Zasadniczo musisz przekazać do zakresu coś, co może zwrócić/lub utrzymuje aktualną wartość. Na przykład.

fabryczne:

app.factory('testFactory', function(){ 
    var countF = 1; 
    return { 
     getCount : function() { 

      return countF; //we need some way to access actual variable value 
     }, 
     incrementCount:function(){ 
      countF++; 
      return countF; 
     } 
    }    
}); 

Kontroler:

function FactoryCtrl($scope, testService, testFactory) 
{ 
    $scope.countFactory = testFactory.getCount; //passing getter to the view 
    $scope.clickF = function() { 
     $scope.countF = testFactory.incrementCount(); 
    }; 
} 

Widok:

<div ng-controller="FactoryCtrl"> 

    <!-- this is now updated, note how count factory is called --> 
    <p> This is my countFactory variable : {{countFactory()}}</p> 

    <p> This is my updated after click variable : {{countF}}</p> 

    <button ng-click="clickF()" >Factory ++ </button> 
</div> 
+0

Więc zasadniczo, że fabryka jest właśnie wspólny (Singleton) pojemnik do danych i funkcji na danych. Ręcznie zarządzasz/synchronizujesz dane w i poza zasięgiem $ scope? – sambomartin

+1

@Sambomartin w prawo. Wielki artykuł [tutaj] (http://fdietz.github.io/recipes-with-angular-js/controllers/sharing-code-between-controllers-using-services.html) – user4815162342

+2

Przekazując funkcję jako testFactory.getCount i nie wywoływanie go, i wywoływanie go w interfejsie użytkownika, do którego przypisano wartość usługi. Natomiast jeśli $ scope.countFactory = testFactory.getCount() wystarczy wywołać funkcję raz po inicjalizacji i nic nie jest związane? Więc nie zaktualizowane później, jeśli zmieni się wartość? – mtpultz

0

To nie jest dobry pomysł, aby związać żadnych danych z serwisu, ale jeśli trzeba go już, ja sugerują ci, którzy podążają dwoma drogami.

1) Uzyskaj te dane poza swoją usługą. Pobierz dane do kontrolera i nie będziesz mieć problemu z jego powiązaniem.

2) Możesz użyć funkcji AngularJs Events. Możesz nawet wysyłać dane do tego wydarzenia.

Jeśli potrzebujesz więcej przykładów, oto artykuł, który może ci pomóc.

http://www.w3docs.com/snippets/angularjs/bind-value-between-service-and-controller-directive.html

Powiązane problemy