Angularjs将控制器解析为字符串
我编写角度控制器的风格如下(使用控制器名称而不是函数) 我现在需要的是在提供我想要定义的解决部分时:Angularjs将控制器解析为字符串,angularjs,Angularjs,我编写角度控制器的风格如下(使用控制器名称而不是函数) 我现在需要的是在提供我想要定义的解决部分时: $routeProvider.when('/someroute', { templateUrl: 'partials/someroute.html', resolve: myController.resolve}) // THIS IS THE CRITICAL LINE 既然控制器被定义为一个名称,如何完成下面的部分 为了更详细地说明,我想在解析路由之前从
$routeProvider.when('/someroute', {
templateUrl: 'partials/someroute.html',
resolve: myController.resolve}) // THIS IS THE CRITICAL LINE
既然控制器被定义为一个名称,如何完成下面的部分
为了更详细地说明,我想在解析路由之前从服务器加载一些数据,然后在控制器中使用这些数据
更新:更准确地说,我希望每个模块都有自己的“resolve”函数,在使用该控制器执行root之前调用该函数。中的解决方案(由Misko Hevery回答)完全符合我的要求,但我没有控制器作为函数,而是作为名称。控制器定义和解析部分将在路由定义中单独指定 如果在模块级别定义控制器,则需要将其作为字符串引用,因此:
$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
}
]);
这段视频可能也会有帮助:@pkozlowski.opensource的答案是可行的,但我真的不想弄乱我的路由和控制器,因为我总是将它与Yo Generator分开。实际上,我们也可以将controller和resolve(r)全部解析为
string
/name(非函数)
然后在您的路由文件中,应该添加此选项
$routeProvider.when('/someroute', {
templateUrl: 'partials/someroute.html',
resolve: ['myModel'] //ALWAYS IN ARRAY)
});
$routeProvider.when('/myModelCombination', {
templateUrl: 'partials/someroute2.html',
resolve: ['myModel'] //ALWAYS IN ARRAY)
});
.$routeProvider@TruongSinh的答案对我来说很有用,而且比在路由器中增加功能要好得多。我对它进行了一些调整,因为它返回的是延迟对象,而不是实际解析的数据
$routeProvider.when('/someroute', {
templateUrl: 'partials/someroute.html',
controller: 'SomeController',
resolve: {
myModel: 'myModel'
}
});
这也行
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;
}]
};
@AndrejKaurin您可以向控制器和解析函数注入服务,如果这是您所要求的。。。你能更精确一点吗?在when()中,应该是
'myController',
控制器:'myController',?@MarkRajcok。已修复。@pkozlowski.opensource我收到一个关于myVarProvider的错误,未知。你知道为什么吗?你用的是什么版本?myModel工厂应该还承诺吗?那么,如何通过单个工厂(本例中为myModel)返回更多承诺?或者我应该为每个解决方案创建一个新工厂。是的,每个工厂应该返回一个且只有一个东西,要么是价值,要么是承诺,除非您想等待一切,然后以$q.all()返回所有内容。答案已编辑。这似乎不起作用。你能展示一把小提琴吗?能在这里发布你的整个解决方案吗?我正在尝试做同样的事情(在resolve上返回一个延迟的对象),但很难让它工作。谢谢
$routeProvider.when('/someroute', {
templateUrl: 'partials/someroute.html',
controller: 'SomeController',
resolve: {
myModel: 'myModel'
}
});
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;
}]
};