【问题标题】:Angularjs: How to inject dependency from resolve routeProviderAngularjs:如何从解析 routeProvider 注入依赖项
【发布时间】:2015-05-13 21:10:33
【问题描述】:

我在将路由中的解析参数注入控制器时遇到问题。我将解析值设置为对象{name: 'Banner', slug: 'banner'},但出现错误。

App.js

var app = angular.module('CMS', ['fields', 'ngRoute']);

app.controller('ModuleController', ['$http', 'properties',
  function($http, properties) {
    var module = this;
    module.properties = properties;

    if (module.properties.slug.length) {
      $http.get(module.properties.slug + '.php').success(function(data) {
        module.list = data;
      });
    }
  }
]);

app.controller('HomeController', function() {});

app.config(function($routeProvider) {
  $routeProvider
  // route for the banner page
  .when('/banner1', {
    templateUrl: 'banner1.php',
    controller: 'ModuleController',
    resolve: {
      properties: function() {
        return { name: 'Banner', slug: 'banner' };
      }
    }
  })
  .when('/home', {
    templateUrl: 'home.php',
    controller: 'HomeController'
  })
  .otherwise({
    redirectTo: '/home'
  });
});

错误:

 Error: [$injector:unpr] http://errors.angularjs.org/1.3.14/$injector/unpr?p0=propertiesProvider%20%3C-%20properties%20%3C-%20ModuleController
    at Error (native)
    at http://modelo2.desenvolvimento.com/adm/js/angular/angular.min.js:6:417
    at http://modelo2.desenvolvimento.com/adm/js/angular/angular.min.js:38:7
    at Object.d [as get] (http://modelo2.desenvolvimento.com/adm/js/angular/angular.min.js:36:13)
    at http://modelo2.desenvolvimento.com/adm/js/angular/angular.min.js:38:81
    at d (http://modelo2.desenvolvimento.com/adm/js/angular/angular.min.js:36:13)
    at Object.e [as invoke] (http://modelo2.desenvolvimento.com/adm/js/angular/angular.min.js:36:283)
    at $get.w.instance (http://modelo2.desenvolvimento.com/adm/js/angular/angular.min.js:75:451)
    at http://modelo2.desenvolvimento.com/adm/js/angular/angular.min.js:58:476
    at s (http://modelo2.desenvolvimento.com/adm/js/angular/angular.min.js:7:408) <div ng-view="" class="ng-scope">

【问题讨论】:

  • 您知道吗,当您使用非缩小版本的 Angular 时,您会收到更多描述性的错误消息?下次试试
  • 我猜是因为你在/banner1.php中使用ng-controller="ModuleController"
  • 它是banner1.php 上的ng-controller。谢谢@NewDev!
  • 我更全面地回答了它作为一个正确的答案
  • 如何解决?我有同样的问题,解决我有数据,但在控制器中没有

标签: angularjs routes dependencies code-injection resolve


【解决方案1】:

ngRoute 支持将解析变量注入控制器,这对于应用的横切关注点非常有用,例如应用的身份验证或配置。

缺点是控制器只能使用这些可注入的参数进行实例化,这意味着您要么手动实例化控制器(使用$controller),但几乎从来没有这种情况,或与ngRoute 一起解决。对于这样的控制器,你不能用ng-controller 或在注入参数不可用的任何其他位置实例化它。

这个错误表明除了在路由上定义了控制器,你还在路由的模板中定义了ng-controller的控制器。控制器的第二个实例化失败了。

【讨论】:

  • 谢谢!我在其他任何地方都找不到解释。
  • 我快疯了,错误信息应该更能说明问题
【解决方案2】:

您可以使用 $route 服务在控制器中获取已解析的数据。

请在此处查看演示http://plnkr.co/edit/2oID3G0QStTOGEPPLQ3h?p=preview

所以在您的示例中,它将如下所示:

.when('/banner1', {
    templateUrl: 'banner1.php',
    controller: 'ModuleController',
    resolve: {
      properties: function() {
        return { name: 'Banner', slug: 'banner' };
      }
    }
  })

在控制器中:

app.controller('ModuleController', ['$http', '$route',
  function($http, $route) {
    var module = this;

   //get resolved properties
    module.properties = $route.current.locals.properties;

    if (module.properties.slug.length) {
      $http.get(module.properties.slug + '.php').success(function(data) {
        module.list = data;
      });
    }
  }
]);

【讨论】:

    【解决方案3】:
    resolve : {
        properties : ['projects', 'user', function (projects, user) {
            return user.getData().then(function () {
                return projects.getData();
            });
        }]
    }
    

    【讨论】:

    • 添加一些解释
    • 请在您的回答中提供更多详细信息,因为该帖子已在低质量帖子中找到。不鼓励仅使用代码和“试试这个”的答案,因为它不提供任何可搜索的内容以及人们应该“试试这个”的原因。
    【解决方案4】:

    在 ng-route 中使用依赖注入 试试这个;

    var myApp = angular.module("myApp", ["ngRoute", "localytics.directives"]);
    
    myApp.config(['$routeProvider',function ($routeProvider) {
    
        $routeProvider
            .when("/", {
                templateUrl: "/TimeLine.html",
                controller: "MainCtrl"
            })    
            .when("/AddOrEditOccasion", {
                templateUrl: "/Html/GiftWhiz/AddOrEditOccasion.html",
                controller: "AddOrEditOccasionCtrl"
            })
            .when("/OccasionStart", {
                templateUrl: "/OccasionStart.html",
                controller: "OccasionStartCtrl"
            })        
    }]);
    
    
    myApp.controller("MainCtrl", ['$scope', '$http', '$location', function ($scope, $http, $location) {
    
       //your codes
    
    }]);
    

    【讨论】:

    • 感谢您提供此代码 sn-p,它可能会提供一些有限的短期帮助。一个正确的解释would greatly improve 它的长期价值通过展示为什么这是一个很好的解决问题的方法,并将使它对未来有其他类似问题的读者更有用。请edit您的回答添加一些解释,包括您所做的假设。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    相关资源
    最近更新 更多