2013-08-01 11 views
10

Mam problem z uruchomieniem zegarka do pracy w ramach dyrektywy. Złożyłem tutaj prosty przykład. http://plnkr.co/edit/A7zbrsh8gJhdpM30ZH2PZmieniono wartość usługi AngularJS, która nie wyzwala zegarka w ramach dyrektywy

Mam usługę i dwie dyrektywy. Jedna dyrektywa zmienia właściwość w usłudze, a inna dyrektywa ma zegarek na tej właściwości. Spodziewałem się, że zegarek zostanie zwolniony po zmianie właściwości, ale tak się nie stanie.

Widziałem kilka innych podobnych pytań na stronie, ale przyjęte rozwiązania na nich nie działały tutaj. Zastanawiałem się nad użyciem transmisji $ lub próbą zaimplementowania obserwatora, ale wygląda na to, że to powinno zadziałać i nie chcę zbytnio komplikować, jeśli to możliwe.

Odpowiedz

5

Zamiast

this.currentObject = newObject; 

użytku

angular.copy(newObject, this.currentObject); 

z oryginalnym kodem dyrektywa viewer ogląda oryginalnego obiektu, {}. Gdy currentObject jest ustawiony na newObject, zegarek $ nadal szuka zmiany oryginalnego obiektu, a nie newObject.

Angular.copy() modyfikuje oryginalny obiekt, więc $ watch widzi tę zmianę.

+0

Dzięki, wiedziałem, że to prawdopodobnie coś prostego. Kolejny wątek wspomniał, że przekazanie trzeciej własności zegarka jako prawdziwej obsługiwałoby to, więc przestałem badać tę trasę. –

28

Odpowiedź Marka Rajcoka jest niekompletna. Nawet za pomocą metody angular.copy(), detektor $ watch zostanie wywołany raz i nigdy więcej.

Musisz $ oglądać funkcję:

$scope.$watch(

    // This is the important part 
    function() { 
    return demoService.currentObject; 
    }, 

    function(newValue, oldValue) { 
    console.log('demoService.currentObject has been changed'); 
    // Do whatever you want with demoService.currenctObject 
    }, 
    true 
); 

Tutaj plunker że działa: http://plnkr.co/edit/0mav32?p=preview

Otwórz konsolę przeglądarki, aby zobaczyć, że zarówno dyrektywa i demoService2 są powiadamiani o zmianach demoService.currentObject .

I btw angular.copy() nie jest nawet potrzebny w tym przykładzie.

+2

Doskonała odpowiedź. To jest właściwy sposób, aby to zrobić. – krosullivan

Powiązane problemy