2015-03-11 3 views
7

У меня есть проблема с введением параметров разрешения из маршрутизации в контроллер. Я устанавливаю значение разрешения для объекта {name: 'Banner', slug: 'banner'}, но я получаю сообщение об ошибке.Angularjs: Как вводить зависимость от решения routeProvider

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"> 
+0

Знаете ли вы, что когда ты используйте недопустимую версию Angular, вы получите более подробные сообщения об ошибках? Попробуйте в следующий раз –

+0

Я предполагаю, что это потому, что вы используете 'ng-controller =" ModuleController "' in '/ banner1.php' –

+0

Это был ng-контроллер на banner1.php. Спасибо @NewDev! –

ответ

9

ngRoute поддерживает инъекцию разрешенных переменных к контроллеру, который является полезным для сквозных проблем приложения, как аутентификация или конфигурации приложения.

Недостатком является то, что контроллер может только быть реализован с этими параметрами, доступными для инъекций, а это означает, что либо вы экземпляр контроллер вручную (с $controller), который почти никогда делами, или с ngRoute с решимостью. То, что вы не можете сделать с таким контроллером, это создать его с помощью ng-controller или в любом другом месте, где введенные параметры недоступны.

Эта ошибка указывает, что в дополнение к определению контроллера на маршруте у вас также есть контроллер, определенный как ng-controller в шаблоне маршрута. Это второе инстанцирование контроллера - это то, что терпит неудачу.

+0

Спасибо! Я не мог найти объяснений нигде. –

+1

Я схожу с ума, сообщение об ошибке должно быть более объяснительным – gjspaho

7

Вы можете получить разрешенные данные в своем контроллере, используя $ route service.

Пожалуйста, смотрите демо здесь 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; 
     }); 
    } 
    } 
]); 
2
resolve : { 
    properties : ['projects', 'user', function (projects, user) { 
     return user.getData().then(function() { 
      return projects.getData(); 
     }); 
    }] 
} 
+0

Добавить некоторое объяснение – HaveNoDisplayName

+3

Просьба предоставить более подробную информацию для ответа, поскольку это сообщение было найдено в сообщении низкого качества. Только код и ответы «попробуйте» не поощряются, поскольку он не предоставляет никакого контента, доступного для поиска, и почему люди должны «попробовать это». – Paritosh