我的角度控制器的编写方式是这样的(使用控制器名称而不是函数)
angular.module('mymodule', [
])
.controller('myController', [
'$scope',
function($scope) {
// Some code here
}
]);
我现在需要的是提供我想要定义解决方案部分的路线:
$routeProvider.when('/someroute', {
templateUrl: 'partials/someroute.html',
resolve: myController.resolve}) // THIS IS THE CRITICAL LINE
由于控制器被定义为如何完成解析部分的名称?
为了详细说明,我想在解决路由之前从服务器加载一些数据,然后在控制器中使用这些数据。
更新:为了更加精确,我希望每个模块都有其“解析”功能,该功能将在执行该控制器的root之前调用。 this post中的解决方案(由Misko Hevery回答)完全符合我的要求,但我没有控制器作为功能,而是作为名称。
答案 0 :(得分:23)
控制器定义和解析部分将在路径定义中单独指定。
如果在模块级别定义控制器,则需要将它们作为字符串引用,所以:
$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
答案 1 :(得分:14)
@ pkozlowski.opensource的答案有效,但我真的不想搞砸我的路由和控制器,因为我总是把它分开(来自Yo Generator)。实际上,我们也可以将控制器和解析(r)全部设为string
/ name(NOT函数)。
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
答案 2 :(得分:0)
@TruongSinh回答对我有用,并且比在路由器中增加其他功能更好。我稍微调整了它,因为它返回了延迟对象而不是实际已解析的数据。
$routeProvider.when('/someroute', {
templateUrl: 'partials/someroute.html',
controller: 'SomeController',
resolve: {
myModel: 'myModel'
}
});
答案 3 :(得分:0)
这也会起作用
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;
}]
};