一尘不染

根据路由组动态加载控制器

angularjs

是否可以基于路由组动态加载控制器,js文件和模板?伪代码不起作用:

$routeProvider.when('/:plugin', function(plugin) {
  templateUrl: 'plugins/' + plugin + '/index.html',
  controller: plugin + 'Ctrl',
  resolve: { /* Load the JS file, from 'plugins/' + plugin + '/controller.js' */ }
});

我已经看到了很多这样的问题,但是没有一个问题基于路由组加载js文件/控制器。


阅读 230

收藏
2020-07-04

共1个答案

一尘不染

我设法解决了受@ calebboyd,http
//ify.io/lazy-loading-in-angularjs/
http://weblogs.asp.net/dwahlin/archive/2013/05/22/dynamically-
loading启发的问题控制器和视图与angularjs和requirejs.aspx

使用http://dustindiaz.com/scriptjs

app.js

app.config(function($controllerProvider, $compileProvider, $filterProvider, $provide) {
  app.register = {
    controller: $controllerProvider.register,
    directive: $compileProvider.directive,
    filter: $filterProvider.register,
    factory: $provide.factory,
    service: $provide.service
  };
});

然后我注册“按组的负载控制器”路由。

$routeProvider.when('/:plugin', {

  templateUrl: function(rd) {
    return 'plugin/' + rd.plugin + '/index.html';
  },

  resolve: {
    load: function($q, $route, $rootScope) {

      var deferred = $q.defer();

      var dependencies = [
        'plugin/' + $route.current.params.plugin + '/controller.js'
      ];

      $script(dependencies, function () {
        $rootScope.$apply(function() {
          deferred.resolve();
        });
      });

      return deferred.promise;
    }
  }
});

controller.js

app.register.controller('MyPluginCtrl', function ($scope) {
  ...
});

index.html

<div ng-controller="MyPluginCtrl">
  ...
</div>
2020-07-04