2015-09-25 100 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。这会更好,我认为,而不是在不同的控制器中有多个手表功能。 –