【问题标题】:Angular route not firing controller角度路线不触发控制器
【发布时间】:2015-11-11 22:11:55
【问题描述】:

我在获取控制器以执行我的路由时遇到问题。

基本上,我按如下方式注册我的路线:

var App = angular.module('App', ['ngRoute', 'routesControllers']);

App.config(['$routeProvider',
function($routeProvider) {
    $routeProvider.
        when('/', {
            template: " ",
            controller: 'NewOrderCtrl'
        }).
        when('/:companyName/:orderNumber', {
            template: " ",
            controller: 'ViewOrderCtrl'
        }).
        otherwise({
            redirectTo: '/'
        });
}]);

在这里,我没有在模板中定义任何内容,因为我使用我的路由来触发 ajax GET。

我的控制器如下:

var routesControllers = angular.module('routesControllers', []);

routesControllers.controller('NewOrderCtrl', ['OrderManagerFactory', function(OrderManagerFactory) {

  alert('NewOrderCtrl fired!');

  //create a new empty company and order
  OrderManagerFactory.createNewCompany();
  OrderManagerFactory.createNewOrder();

}]);

routesControllers.controller('ViewOrderCtrl', ['OrderManagerFactory', '$routeParams', function(OrderManagerFactory, $routeParams) {

  alert('ViewOrderCtrl fired!');

  //Fire a bunch of ajax calls using the data from $routeParams

}]);

我还为我的空视图放置了一个 div:

<div ng-view ng-controller="ViewOrderCtrl"></div>

例如,当我访问#/tesla/x123x 时,我什么也得不到。任一控制器中的 alert() 都不执行...

有人可以帮忙吗?我错过了什么?

【问题讨论】:

  • 您能在控制台上看到任何错误吗?你加载脚本的顺序是什么? (你在加载 angularjs 路由吗?)
  • 控制台为空。加载脚本的顺序如下:angular.js、angular-route.js、app.js

标签: javascript angularjs


【解决方案1】:

您可以改用resolve 而不是尝试使用controller ...在某种程度上,它并不是您真正拥有的控制器。

resolve - {Object.=} - 一个可选的依赖关系映射,应该注入到控制器中。如果这些依赖项中的任何一个是承诺,路由器将等待它们全部解决或在控制器实例化之前被拒绝。 https://docs.angularjs.org/api/ngRoute/provider/$routeProvider

比如:

 $routeProvider.when('/', { resolve: { init: 'NewOrderService' } });

并将控制器更改为工厂或服务:

routesControllers.service('NewOrderService', ['OrderManagerFactory', function(OrderManagerFactory) {

  alert('NewOrderService fired!');

  //create a new empty company and order
  OrderManagerFactory.createNewCompany();
  OrderManagerFactory.createNewOrder();

}]);

编辑

如果路由有一些参数,可以通过$routeParams 访问。

让工厂/服务依赖于$routeParams 不是可重用模式,因此更新resolve 属性以使用函数会有所帮助:

再次来自文档:

请注意,ngRoute.$routeParams 仍将引用这些解析函数中的先前路由。使用$route.current.params 来访问新的路由参数,而不是

【讨论】:

  • 如何将数据从 url 传递到工厂? url 格式为“/:companyName/:orderNumber”,我想要 companyName 和 orderNumber。
  • 谢谢!好的,尽管这不是我的问题的根源(我的问题是将 ng-app 属性附加到 标签而不是 ),但我仍然将其标记为已接受的答案,因为它是 IMO做我想做的事情的最佳方式。干杯!
  • 太棒了!啊,是的,放错地方的 ng-app 会导致问题:)
猜你喜欢
  • 1970-01-01
  • 2021-05-17
  • 2015-02-14
  • 2017-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-03
相关资源
最近更新 更多