2015-09-25 288 views
1

即使在工廠激活Deep手錶後,它也不會觸發。如何解決這個問題,以便在「名稱」值更改時觸發事件?

JavaScript代碼:

var app = angular.module('app', []); 

app.controller('FirstCtrl', function($scope,testFactory) { 
    $scope.obj = testFactory.obj; 

}); 

app.controller('SecondCtrl',function($scope,testFactory){ 
    $scope.obj = testFactory.obj; 
    $scope.valueChange = testFactory.valueChange; 
}); 

app.factory('testFactory', ['$rootScope',function ($rootScope) { 

    var factory = {}; 

    factory.obj = { 'name':'John Doe'}; 

    $rootScope.$watch(factory.obj,function(){ 
     alert('Value Changed'); 
    },true); 

    factory.valueChange = function(){ 
     if(factory.obj.name == 'John Doe'){ 
     factory.obj.name = "Jane Doe"; 
     } 
     else 
     { 
     factory.obj.name = "John Doe"; 
     } 
    }; 

    return factory; 

}]); 

HTML代碼:

<body > 
    <div ng-controller="FirstCtrl"> 
    <h4>Value bound with FirstCtrl and factory</h4> 
    <input type="text" ng-model="obj.name"/> 
    </div> 

    <div ng-controller="SecondCtrl"> 
    <br> 
    <br> 
    <h4>Value from SecondCtrl. This shows that the bind between factory and controller is working</h4> 
    <p>{{obj.name}}</p> 
    <h4>Value updated directly in the factory</h4> 
    <button ng-click="valueChange()">Change Value</button> 
    </div> 
    </body> 

Plunker:http://plnkr.co/edit/LhHOa2NehWGVEfpHfKJQ?p=preview

回答

1

試試這個方法:

$rootScope.$watch(function() { 
    return factory.obj; 
}, function(){ 
    alert('Value Changed'); 
}, true); 

Plunker

更好的解決方案是監視在控制器的變化,而不是工廠的:

app.controller('SecondCtrl',function($scope,testFactory){ 
    $scope.obj = testFactory.obj; 
    $scope.valueChange = testFactory.valueChange; 
    $scope.$watch('obj', function() { 
     alert('Value changed'); 
    }, true); 
}); 

在這種情況下$scope.objtestFactory.obj指向存儲器相同的對象。所以不管你要注意哪一個。

+0

您能否詳細說明爲什麼手錶在控制器中比在工廠中更好?目前這個值可以通過不同的控制器來改變,所以在工廠裏使用一個手錶是有道理的,對嗎? –

+0

您可以在工廠檢查'valueChange'函數中的值更改,您爲什麼需要在那裏觀看? – karaxuna

+0

哦,不,不。那只是一個例子。要監視的「值」在控制器中直接更改,而不是通過工廠中的功能。我需要觸發一個函數,以防止任何控制器更改'值',因此我需要在工廠中使用$ watch。這會更好,我認爲,而不是在不同的控制器中有多個手錶功能。 –