如何为路由动态设置控制器?

How to set controller dynamically for a route?

让我给出一个示例代码来更好地解释。下面是代码:

$routeProvider
  .when("/b/:param",{
    templateUrl:"main.html"
    controller:"MainCtrl"
  })
  .when("/c/:param",{
    templateUrl:"main.html"
  });

现在从上面的代码中您可以看到,对于一条路线,我已经指定了要分配给视图的控制器,而对于另一条路线,我没有添加控制器 属性 所以对于那条路线页面上不会分配任何控制器。

Now my question :

When I don't specify the controller property in the route is there any other way that I can assign the controller for that route dynamically?

我试过的

如果问题仍然不清楚,请在此问题下方添加评论。谢谢。

Apparently,是ngView指令(其中之一)负责提供路由相关的控制器。它看起来是补丁的好地方。 ngView 指令计数随时间从 1 到 2 变化,目标是最后一个。

app.decorator('ngViewDirective', function ($delegate, $route, $injector) {
    var ngViewHelper = $delegate[$delegate.length - 1];

    var compile_ = ngViewHelper.compile || function () {};
    var link_ = ngViewHelper.link;

    var link = function () {
        var current = $route.current;

        if (current.controllerProvider) {
            current.controller = $injector.invoke(current.controllerProvider);
        }

        link_.apply(null, arguments);
    }
    ngViewHelper.compile = function () {
        compile_.apply(ngViewHelper, arguments);
        return link;
    };

    return $delegate;
});

它为路由提供了controllerProvider参数,类似于the one from ui-router(抱歉)。

controllerProvider 基本上是一个利用依赖注入的函数($route$routeParams 在那里肯定是受欢迎的)和 returns 作为字符串的控制器,一个构造函数,或者根本没有控制器 (undefined)。

  ...
  .when("/:id", {
    controllerProvider: function ($routeParams) {
      var controller;
      if ($routeParams.id == 'foo')
        controller = 'FooController';
      else if ($routeParams.id == 'bar')
        controller = function ($scope) { ... };
      return controller;
    }
  });