根据我的阅读,似乎使用$ rootScope。除非绝对必要,否则不建议使用$ broadcast。我在服务中使用它来通知控制器变量已经改变。这是不正确的?有没有更好的方法呢?我是否应该使用watch(即使变量仅在用户交互时发生变化)?
服务:
section.Add(new Paragraph(" ", m_font));
//在要通知的控制器中:
function Buildservice($rootScope) {
var vm = this;
vm.box= [];
var service = {
addItem: addItem,
};
return service;
// Add item to the box
// Called from a directive controller
function addItem(item) {
vm.box.push(item);
broadcastUpdate();
}
function broadcastUpdate() {
$rootScope.$broadcast('updateMe');
}
//并从一个单独的指令控制器:
// Listener for box updates
$scope.$on('updateMe', function() {
// update variable binded to this controller
});
所以这对我来说很好,但我无法弄清楚这是否是我应该这样做的方式。感谢帮助!
答案 0 :(得分:0)
如果你在同一个模块中,为什么不使用$ scope而不是$ rootScope?
答案 1 :(得分:0)
您可以使用回调函数通知控制器某些内容已更改。您可以从控制器向服务提供函数,并在更改变量时调用该特定函数。如果需要,您还可以通知多个控制器。
我创建了一个小例子:
HMTL:
<div ng-controller="CtrlA as A">
{{A.label}}
<input type="text" ng-model="A.input" />
<button ng-click="A.set()">set</button>
</div>
<div ng-controller="CtrlB as B">
{{B.label}}
<input type="text" ng-model="B.input" />
<button ng-click="B.set()">set</button>
</div>
JS
var app = angular.module('plunker', []);
app.controller('CtrlA', function(AService) {
var vm = this;
vm.label = AService.get();
vm.notify = function() {
vm.label = AService.get();
}
vm.set = function() {
AService.set(vm.input)
}
AService.register(vm.notify);
});
app.controller('CtrlB', function(AService) {
var vm = this;
vm.label = AService.get();
vm.notify = function() {
vm.label = AService.get();
}
vm.set = function() {
AService.set(vm.input)
}
AService.register(vm.notify);
});
app.factory("AService", function() {
var myVar = "Observer";
var observers = [];
return {
get: function() {
return myVar;
},
set: function(name) {
console.log(name);
myVar = name;
this.notify();
},
register: function(fn) {
observers.push(fn);
},
notify: function() {
for( i = 0; i < observers.length; i++) {
observers[i]();
}
}
}
})
执行此操作时,您会看到当内部变量发生更改时,控制器会收到通知。 (注意:我没有从列表中过滤原始发件人)(Plnkr)