Решение Angularjs с контроллером как строка
Мой стиль написания контроллеров angular подобен (с использованием имени контроллера вместо функции)
angular.module('mymodule', [
])
.controller('myController', [
'$scope',
function($scope) {
// Some code here
}
]);
Теперь мне нужно предоставить i-маршруты, чтобы определить часть решения:
$routeProvider.when('/someroute', {
templateUrl: 'partials/someroute.html',
resolve: myController.resolve}) // THIS IS THE CRITICAL LINE
Поскольку контроллер определяется как имя, как выполнить часть решения ниже?
Чтобы уточнить детали, я хочу загрузить некоторые данные с сервера до того, как маршрут будет разрешен, а затем использовать эти данные в контроллере.
ОБНОВЛЕНИЕ: Чтобы быть более точным, я хочу, чтобы каждый модуль имел свою функцию "разрешения", которая будет вызываться до того, как root будет запущен. Решение в этом сообщении (ответил Мишко Хевери) делает именно то, что я хочу, но у меня нет контроллеров как функций, а как имена.
Ответы
Ответ 1
Детали определения и разрешения контроллера должны быть указаны отдельно в определении маршрута.
Если вы определяете контроллеры на уровне модуля, вам нужно ссылаться на них как на строку, поэтому:
$routeProvider.when('/someroute', {
templateUrl: 'partials/someroute.html',
controller: 'myController',
resolve: {
myVar: function(){
//code to be executed before route change goes here
};
});
В приведенном выше коде также показано, как определить набор переменных, которые будут разрешены до изменения маршрута. При разрешении эти переменные могут быть введены в контроллер, поэтому, взяв пример из фрагмента выше, вы должны написать свой контроллер следующим образом:
.controller('myController', ['$scope', 'myVar', function($scope, myVar) {
// myVar is already resolved and injected here
}
]);
Это видео может также помочь: http://www.youtube.com/watch?v=P6KITGRQujQ
Ответ 2
@pkozlowski.opensource отвечает, но я действительно не хочу испортить свои маршруты и контроллеры, потому что я всегда держу его отдельно (от Yo Generator). На самом деле, мы можем также иметь контроллер и разрешать (r) все как string
/name (NOT function).
angular.module('mymodule', [
])
.controller('myController', [
'$scope', 'myModelCombination'
function($scope, myModelCombination) {
// myModelCombination[0] === (resolved) myModel
// myModelCombination[1] === (resolved) myModel2
}
])
.controller('myController2', [
'$scope', 'myModel'
function($scope, myModel) {
// Some code here
}
])
.factory('myModel', [
'$scope',
function($scope) {
// return a promise
}
])
.factory('myModel2', [
'$scope',
function($scope) {
// return a promise
}
])
.factory('myModelCombination', [
'$scope', 'myModel', 'myModel2'
function($scope) {
return $q.all(['myModel', 'myModel2']);
}
]);
Затем в вашем файле маршрутизации следует добавить
$routeProvider.when('/someroute', {
templateUrl: 'partials/someroute.html',
resolve: ['myModel'] //ALWAYS IN ARRAY)
});
$routeProvider.when('/myModelCombination', {
templateUrl: 'partials/someroute2.html',
resolve: ['myModel'] //ALWAYS IN ARRAY)
});
http://docs.angularjs.org/api/ng. $routeProvider
Ответ 3
Ответ @TruongSinh работал у меня и намного лучше, чем наличие дополнительных функций в маршрутизаторе. Я немного изменил его, поскольку он возвращал отложенный объект вместо фактических разрешенных данных.
$routeProvider.when('/someroute', {
templateUrl: 'partials/someroute.html',
controller: 'SomeController',
resolve: {
myModel: 'myModel'
}
});
Ответ 4
Это тоже сработает
var MyController = myApp.controller('MyController', ['$scope', 'myData', function($scope, myData) {
// Some code here
}]);
MyController.resolve = {
myData: ['$http', '$q', function($http, $q) {
var defer = $q.defer();
$http.get('/foo/bar')
.success(function(data) {
defer.resolve(data);
})
.error(function(error, status) {
defer.reject(error);
});
return defer.promise;
}]
};