我正在尝试使用$broadcast从一个控制器到另一个控制器的一些数据。
如果我使用像ng单击这样的触发器来运行将广播的函数,那么它似乎工作得很好,但是如果没有它,它是如何工作的呢?
正如您在小提琴中看到的,我在一个$scope.cast函数中播放了这个广播,所以如果我像这样运行这个函数:$scope.cast();,它为什么不能工作呢?
小提琴:https://jsfiddle.net/kjgj7Ldz/19/
我需要这样做,因为我在第一个控制器中获得了一些数据,当数据完成时,我想在没有ng-click、ng-change或任何其他触发器的情况下自动广播它。
在这种情况下,$broaadcast是一件错误的事情吗?如果是这样,如何实现这两个控制器之间的数据通信?
发布于 2016-07-14 11:04:59
您可以通过创建一个简单的发布子服务来为您处理通信通道,从而避免使用控制器之间的交换范围。例如,它可以为晚订阅者传递所有消息。演示。
app.service('MQ', function() {
var listeners = [],
messages = [];
return {
pub: function(message) {
listeners.slice(0).forEach(function(listener) {
try {
listener(message)
} catch (ignored) {
console.log(ignored)
}
})
// save message for late subscribers.
messages.push(message)
},
sub: function(listener) {
// deliver all messages
messages.slice(0).forEach(function(message) {
try {
listener(message)
} catch (ignored) {
console.log(ignored)
}
})
// save listener
listeners.push(listener)
// create unbinder
return function() {
listeners.splice(listeners.indexOf(listener), 1)
}
}
}
})
app.controller('Controller1', ['$scope', 'MQ', function($scope, MQ) {
MQ.pub('John Snow')
$scope.cast = function() {
MQ.pub(Math.random())
}
}]);
app.controller('Controller2', ['$scope', 'MQ', function($scope, MQ) {
var unsub = MQ.sub(function(message) {
$scope.message = message
})
// clean-up bindings on scope destroy.
$scope.$on('$destroy', unsub)
}]);https://stackoverflow.com/questions/38371864
复制相似问题