首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >以控制器为字符串的Angularjs解析

以控制器为字符串的Angularjs解析
EN

Stack Overflow用户
提问于 2013-02-20 13:16:51
回答 4查看 24K关注 0票数 22

我编写角度控制器的方式如下(使用控制器名称而不是函数)

代码语言:javascript
运行
复制
angular.module('mymodule', [
])
    .controller('myController', [
        '$scope',
        function($scope) {
            // Some code here

        }
    ]);

我现在需要的是,当提供我想要定义解决部分的路由时:

代码语言:javascript
运行
复制
 $routeProvider.when('/someroute', {
        templateUrl: 'partials/someroute.html', 
        resolve: myController.resolve}) // THIS IS THE CRITICAL LINE

既然控制器被定义为一个名称,那么如何解决这个问题呢?

为了更详细地说明,我想在解析路由之前从服务器加载一些数据,然后在控制器中使用这些数据。

更新:更准确地说,我希望每个模块都有它的“解析”函数,在执行该控制器的根之前将调用该函数。this post中的解决方案(由Misko回答)可以做我想做的事情,但是我没有控制器作为函数,而是作为一个名称。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-02-20 13:52:39

控制器定义和解析部分将在路由定义上单独指定。

如果在模块级别上定义控制器,则需要将它们引用为字符串,因此:

代码语言:javascript
运行
复制
 $routeProvider.when('/someroute', {
        templateUrl: 'partials/someroute.html', 
        controller: 'myController',
        resolve: {
          myVar: function(){
            //code to be executed before route change goes here
          };
        });

上面的代码还显示了如何定义一组变量,这些变量在路由更改之前将被解析。解析后,可以将这些变量注入控制器,因此,以上面片段中的示例为例,您将编写如下控制器:

代码语言:javascript
运行
复制
.controller('myController', ['$scope', 'myVar', function($scope, myVar) {
            // myVar is already resolved and injected here
        }
    ]);

这个视频可能也有帮助:http://www.youtube.com/watch?v=P6KITGRQujQ

票数 24
EN

Stack Overflow用户

发布于 2013-06-11 08:01:09

@pkozlowski.opensource的答案是有效的,但我不想搞砸我的路由和控制器,因为我总是把它与Yo生成器分开。实际上,我们也可以拥有控制器和解析(R),它们都是string/name (非函数)。

代码语言:javascript
运行
复制
angular.module('mymodule', [
])
  .controller('myController', [
      '$scope', 'myModelCombination'
      function($scope, myModelCombination) {
          // myModelCombination[0] === (resolved) myModel 
          // myModelCombination[1] === (resolved) myModel2

      }
  ])
  .controller('myController2', [
      '$scope', 'myModel'
      function($scope, myModel) {
          // Some code here

      }
  ])
  .factory('myModel', [
      '$scope',
      function($scope) {
          // return a promise

      }
  ])
  .factory('myModel2', [
      '$scope',
      function($scope) {
          // return a promise

      }
  ])
  .factory('myModelCombination', [
      '$scope', 'myModel', 'myModel2'
      function($scope) {
          return $q.all(['myModel', 'myModel2']);

      }
  ]);

然后在您的路由文件中应该添加此内容。

代码语言:javascript
运行
复制
$routeProvider.when('/someroute', {
    templateUrl: 'partials/someroute.html', 
    resolve: ['myModel'] //ALWAYS IN ARRAY)
});
$routeProvider.when('/myModelCombination', {
    templateUrl: 'partials/someroute2.html', 
    resolve: ['myModel'] //ALWAYS IN ARRAY)
});

http://docs.angularjs.org/api/ng.$routeProvider

票数 13
EN

Stack Overflow用户

发布于 2015-10-23 09:37:06

这样也行

代码语言:javascript
运行
复制
var MyController = myApp.controller('MyController', ['$scope', 'myData', function($scope, myData) {
  // Some code here
}]);

MyController.resolve = {
  myData: ['$http', '$q', function($http, $q) {
    var defer = $q.defer();

    $http.get('/foo/bar')
      .success(function(data) {
        defer.resolve(data);
      })
      .error(function(error, status) {
        defer.reject(error);
      });

    return defer.promise;
  }]
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14980805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档