我的程序中有以下逻辑:
所以这是$ modal的简单调用:
var modalInstance = $modal.open({
// here goes modal configuration
});
modalInstance.result.then(function (chosenProject) {
// some action on data returned from modal
})
我需要的是在我打算从#2打开该对话框之前播放一个事件。一个"中介"订阅该事件的代码应该影响#2-3的操作,即能够阻止执行这些步骤。所以,我愿意有这样的执行计划:
代码将开始显示为:
$rootScope.$broadcast("aboutToOpenDialog");
/// !!! Then I need some function to listen to the event, make decision, return some data,
/// and I want then use that data to decide, if I open dialog or not:
var modalInstance = $modal.open({
// here goes modal configuration
});
modalInstance.result.then(function (chosenProject) {
// some action on data returned from modal
})
我如何使用angular?
编写这样的事件驱动序列答案 0 :(得分:1)
您可以使用$event
对象来实现您想要的目标。
广播时,将创建$event
对象并将其发送给所有听众。您有机会在其中一个侦听器中将所需的任何返回值存储到$event
对象中(或使用内置的preventDefault()
机制),如下所示:
$scope.$on('aboutToOpenDialog', function ($event) {
// you could use built-in preventDefault() and defaultPrevented
if ($scope.noModal) {
$event.preventDefault();
}
// or just assign any values to some property and get it back later.
$event.someReturnValue = $scope.noModal ? 'noModal' : 'showModal';
});
当广播结束时,$broadcast()
将返回相同的$event
对象,您可以检查其中的值。
$scope.openDialog = function() {
var $event = $rootScope.$broadcast("aboutToOpenDialog");
if (!$event.defaultPrevented) {
// $modal.open() here
console.log('open modal');
} else {
console.log('suppress modal');
}
// or
if ($event.someReturnValue === 'showModal') {
// $modal.open() here
console.log('open modal again');
}
};
示例plunker: http://plnkr.co/edit/GjsfoqOLjEAqMzoa8IHp?p=preview
希望这有帮助。