【问题标题】:How can I combine my controllers AngularJS?如何组合我的控制器 AngularJS?
【发布时间】:2013-01-08 08:46:58
【问题描述】:

我有我的 MainCtrl(从 $routeProvider 和 html 调用):

function MainCtrl($scope, $routeParams){
  //send data(see below) to AngularTemplate for apdate page
}

我有我的函数,它可以获取任何数据:

function getData($scope, $http){
  /*
  * Nav Data(here my navigate-structure fo site)
  */
  $http({method: 'GET', url: 'data/main.json'}).
  success(function(data){
    //work with data and send it to MainCtrl
  });
  /*
  * News Data(Here my news)
  */
  $http({method: 'GET', url: 'data/news.json'}).
  success(function(data){
    //work with data and send it to MainCtrl
  });
}

现在我明白了如何使用 .$on 和 .$broadcast 将数据从一个 Ctrl 发送到另一个 Ctrl。但是 getData 不是 Angular 控制器(它是一个 js 函数),它不理解我的 args($scope 和 $http)。 请告诉我,如何在第一页加载时调用 getdata 并将数据发送到 MainCtrl。 如果你知道,请告诉我我能用我的 MainCtrl 做什么,他只能从 $routeProvider 调用。现在一开始它从 html(ng-controller) 调用,然后从 $routeProvider 调用。

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    将 getData 函数放入角度控制器。 它会理解 $scope 和 $http 服务

    或制作 mainCtrl.... 的原型方法 set() 并在其中传递 $scope.var = value

           MainCtrl.prototype = {
            set = function(value){
                $scope=value;
    
             }
    
        }
    

    【讨论】:

    • Thnx,这是我的控制器之间简单共享的好主意。但是如何将我的函数转换为 Angular 控制器?我不想将 getData 插入 MainCtrl,因为在更改 windov.location.hash 时总是调用 MainCtrl
    • 基本上你有一个控制器用于一个视图
    • 给 html 标签一个控制器,它将成为你的根控制器。然后你可以从那个控制器广播到这个子控制器。希望这会有所帮助
    【解决方案2】:

    将您的数据获取代码封装在服务中。这里有两个很好的 SO 答案,展示了如何做到这一点:

    上面的示例还展示了如何将您创建的服务(例如,myService)注入到控制器中。您可以根据需要将此服务注入到尽可能多的控制器中。由于 Angular 服务是单例的,因此无论您的服务注入了多少控制器,您的数据获取代码都只会有一个实例。

    您的服务也可以cache the results of the $http request

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-11
      • 2013-03-31
      • 1970-01-01
      • 2017-03-16
      • 2021-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多