0

你如何引导一个通过 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;
      }
    }
 })

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

看看这个 plunkr

4

2 回答 2

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

于 2013-06-17T14:33:44.980 回答
-1

已经 3 年了,但以防万一有人仍然感兴趣,几个月前我写了一篇关于类似技术的文章

最重要的部分是method$routeProvider.when(route, ctrl)方法的第二个参数可以处理promise,所以你可以简单地模拟它:

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'))
于 2016-02-27T19:35:47.070 回答