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

时间:2015-09-30 22:46:42

标签: javascript angularjs controller routes

让我举一个示例代码来更好地解释.Below是代码:

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

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

  

现在我的问题:

     

当我没有在路由中指定控制器属性时,还有其他方法可以为该路由分配控制器   动态吗

我尝试了什么

  • 我已经浏览了一些与此相关的SO页面,其中一个是 - > dynamically loading the controller in angularjs $routeProvider

    现在我已尝试过上述帖子中的一些解决方案,但对我来说无效。如果有任何解决方案,请告诉我有关如何实施它们的更多信息。

    在页面内设置控制器或使用ui-router的解决方案并不是我想要的解决方案类型。所以请不要给出这样的答案。

  • 我尝试使用$ controllerProvider&提供的一些功能来设置控制器。 $ controller,$ routeProvider& $ route但是没有成功。我仍然不确定是否使用它们我可以完成任务,如果他们这样做,请回答如何使用它们。

如果问题仍然不明确,请在此问题下面添加评论。谢谢。

1 个答案:

答案 0 :(得分:1)

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肯定会受到欢迎)并将控制器作为字符串,构造函数或无控制器返回根本(undefined)。

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