javascript - 当 https 成功时在 Controller 之间传递数据

标签 javascript angularjs performance

我试图在每个 http 请求成功时在 Controller 之间传递数据。也就是说,这是一个层次结构

<div ng-controller="ParentCtrl as parent">
   <div ng-controller="ChildOneCtrl as chi1"></div>
   <div ng-controller="ChildTwoCtrl as chi2"></div>
   <div ng-controller="ChildThreeCtrl as chi3"></div>
</div>

在每个下一个 Controller 中加载数据取决于前一个 Controller ,即 http 请求成功时。

ChildOneCtrl:

function ChildOneCtrl ($scope, sharedService) {

   var chi1 = this;

   sharedService.getChildOneData()
       .then(function (res) {
            $rootScope.$emit('childOneDataEmited', res.data);
       }).catch(function (err) {
           console.log(err);
       });
}

ChildTwoCtrl:

function ChildTwoCtrl ($scope, $rootScope, sharedService) {

   var chi2 = this;

   var onEmitChildOne = $rootScope.$on('childOneDataEmited', function (event, data) {
        getData(data);    
   });

   $scope.$on('$destroy', onEmitChildOne);

   function getData(data){

       var chi1Data = data;

       if(chi1Data.uEnabled){
           sharedService.getChildTwoData()
              .then(function (res) {
                  $rootScope.$emit('childTwoDataEmited', res.data);
              }).catch(function (err) {
                 console.log(err);
              });
       }
   }
}

ChildThreeCtrl:

function ChildThreeCtrl ($scope, $rootScope, sharedService) {

   var chi3 = this;

   var onEmitChildThree = $rootScope.$on('childTwoDataEmited', function (event, data) {
        getData(data);    
   });

   $scope.$on('$destroy', onEmitChildThree);

   function getData(data){

       var chi2Data = data;

       sharedService.getChildThreeData()
          .then(function (res) {
               //to do some data manipulation
               console.log(res)
               console.log(chi2Data)
          }).catch(function (err) {
              console.log(err);
          });
   }
}

虽然这样可以完成工作,但层次结构可能会发生变化,变得更深,所以我想知道是否有更好的方法来做到这一点,这样我就不会过度使用事件?

最佳答案

为什么不通过 sharedService 共享它自己的数据?
从第一个 Controller 获取数据后,只需将其分配给 sharedService 中的共享变量,然后在子 Controller (第二个 Controller )中为该共享变量设置一个 watch。像这样:

function ChildOneCtrl ($scope, sharedService) {

   var chi1 = this;

   sharedService.getChildOneData()
       .then(function (res) {
            sharedService.sharedData = res.Data;
       }).catch(function (err) {
           console.log(err);
       });
}

function ChildTwoCtrl ($scope, $rootScope, sharedService) {

   var chi2 = this;

   $scope.watch('sharedService.sharedData', function(newValue) {
         // do something like calling another endpoint using http.
   });
}  

我没试过,它可能会失败,但我的想法是通过服务共享数据。

更新
另一种方法是有两个 then() 或更多:

function sharedService($q, $http) {
   var service = {
       sharedData1Promise: { then: function() {} },
       sharedData2Promise: { then: function() {} },
       sharedData3Promise: { then: function() {} },
       getSomeData1: getSomeData1
   };

   function getSomeData1() {
       sharedData1Promise = $http.get( /* what ever is here */ );
       return sharedData1Promise;
   }

   function getSomeData2() {
      sharedData2Promise = $http.get( /* what ever is here */ );
      return sharedData2Promise;
   }

   function getSomeData3() {
      sharedData3Promise = $http.get( /* what ever is here */ );
      return sharedData3Promise;
   }

   return service;
}

function ChildOneCtrl ($scope, sharedService) {

   var chi1 = this;

   sharedService.getSomeData1()
       .then(function (res) {
            /* do something */
       }).catch(function (err) {
           console.log(err);
       });
}

function ChildTwoCtrl ($scope, sharedService) {

   var chi2 = this;

   sharedService.sharedData1Promise
       .then(function (res) {
           sharedService.getSomeData2();
           /* do something with data coming from the first child calling getSomeData1 method */
       }).catch(function (err) {
           console.log(err);
       });
}

关于javascript - 当 https 成功时在 Controller 之间传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48297385/

相关文章:

javascript - Bootstrap Collapse show.bs.collapse 第二次不工作

javascript - ngBlur 上的 Angular setPristine

javascript - 跨同一域但使用不同端口的页面的本地存储

javascript - 获取 iframe 对象的最佳方法

angularjs - Ui.Bootstrap Typeahead 不适用于异步调用

javascript - 在 AngularJS/TypeScript/ES6 中定义/访问拦截器时出现 TypeError

performance - 相同代码的执行之间的 CPU 时间是否应该始终相同?

c# - .NET 中计算数组平均值的算法的性能问题

python - 用 c++ 重写这个 python 函数似乎让它运行得慢了很多。这合理吗?

javascript - RestAngular:put 和 customPUT 正在发送旧对象,而不是更新对象