异步加载控制器的代码

时间:2013-06-17 13:37:41

标签: angularjs requirejs angular-routing

如何通过require.js引导异步加载的控制器? 如果我有类似的东西:

$routeProvider.when('/',
  {
    templateUrl:'view1.html',
    controller:'ctrl',
    resolve:{
      load:function($q){
        var dfrd = $q.defer();
        require(['view1-script'],function(){
          dfrd.resolve();
        })
        return dfrd.promise;
      }
    }
 })

为什么角度仍然找不到控制器?我在加载脚本后解析路径

check out this plunkr

2 个答案:

答案 0 :(得分:1)

尝试调用$controllerProvider.register来创建控制器。在解决延迟后我也会在$apply()上调用$rootScope因为没有它,视图似乎不会出现:

load: function($q, $rootScope){
  var dfrd = $q.defer();
  require(['view1'],function(){
    dfrd.resolve();
    $rootScope.$apply();
  })
  return dfrd.promise;
}

http://plnkr.co/edit/fe2Q3BhxPYnPmeiOORHP

此外,这是一篇好文章:http://weblogs.asp.net/dwahlin/archive/2013/05/22/dynamically-loading-controllers-and-views-with-angularjs-and-requirejs.aspx

答案 1 :(得分:-1)

已经3年了,但是,如果有人仍然感兴趣,几个月前我写了a post about a similar technique来做这件事。

最重要的部分是方法$routeProvider.when(route, ctrl)方法的第二个参数可以处理承诺,因此您可以简单地模拟它:

function controllerFactory(ctrl) {
  return {
    then: function (done) {
      var self = this;

      require(['./controller/' + ctrl], function (ctrl) {
        self.controller  = ctrl;
        self.resolve     = ctrl.resolve;
        self.templateUrl = ctrl.templateUrl;

         done();
      });
    }
  };
}

你最终可以像这样编写你的路线定义:

$routeProvider.
  when('/some/route', controllerFactory('some/route')).
  when('/other/route', controllerFactory('other/route'))