订阅子作用域上的事件,并在broadcastemit中返回回调

Subscribe an event on child scope and return callback in broadcastemit

本文关键字:broadcastemit 并在 返回 回调 事件 作用域      更新时间:2023-09-26

我是在阅读@toddmotto优秀的帖子后来的,这个,这个和这个答案,api,现在我有了像这样的ctrl结构

<div ng-controller="ParentCtrl as parent" class="ng-scope">
  <div ng-controller="SiblingOneCtrl as sib1" class="ng-scope"></div>
  <div ng-controller="SiblingTwoCtrl as sib2" class="ng-scope"></div>
  <div class="btn btn-primary"
       ng-click="parent.events.saveDreaft()">
       <span class="glyphicon glyphicon-ok"></span>
       <span>Save</span>
  </div>
</div>

&amp;

define(['app'], function (app) {    
   app.controller("ParentCtrl", ['$scope', '$q',  function ($scope, $q) {
        var parent= this;  
        parent.data = {};         
        parent.events = {                
            saveDreaft: function() {
                $scope.$broadcast('saveDreaft');
                //return $q(function(resolve, reject) {
                //    try {
                //        var ee = $scope.$broadcast('saveDreaft');
                //        if (ee)
                //            resolve();
                //    } catch (ex) {
                //        reject(ex);
                //    }
                //});
            }
        };
   }]);
});
//=======
define(['app'], function (app) {
  app.controller("SiblingOneCtrl", ['$scope', '$http', '$q', 
   function ($scope, $http, $q) {
        var sib1 = this;            
        sib1.events = {
           saveSib1Form: function () {
                return $http.post('..', ..)
                            .then(function (res) {..})
                            .catch(function (ex) {..});
            }
        };
        var unbind = $scope.$on('saveDreaft', function (event, data) {
            sib1.events.saveSib1Form();
            //return $q.when(sib1.events.saveSib1Form)
            //         .then(function(res) {
            //              event.targetScope.callbackRes = { 
            //                res: res, 
            //                flag: true 
            //              };
            //          })
            //          .catch(..);
         });
        $scope.$on('$destroy', unbind);
    }]);
});

当客户端从父作用域单击save时,我们希望子级运行自己的save方法,然后向发布者发送一些回调,比如jQuery.Callbacks(),他可能会完成$q承诺。

有什么建议吗?

您可以使用$emit在您的子作用域中实现类似回调的函数:

sib1.events.saveSib1Form();
$scope.$emit('saveComplete', args);

并在您的父作用域中注册$emit事件:

$scope.$on('saveComplete', function(event, args) {
    //your callback code
})