Javascript UI路由器中的ControllerProvider导致错误
我有一个Javascript UI路由器中的ControllerProvider导致错误,javascript,angularjs,angular-ui-router,angular-promise,Javascript,Angularjs,Angular Ui Router,Angular Promise,我有一个ui路由器状态提供程序,需要根据外部数据在控制器和视图之间进行选择,因此我使用了模板提供程序和控制器提供程序 如果我只有TemplateProvider它就可以正常工作,但是当我添加ControllerProvider时,我会出现以下错误: Error: [ng:areq] Argument 'fn' is not a function, got Object http://errors.angularjs.org/1.3.1/ng/areq?p0=fn&p1=not%20aNa
ui路由器
状态提供程序
,需要根据外部数据在控制器和视图之间进行选择,因此我使用了模板提供程序
和控制器提供程序
如果我只有TemplateProvider
它就可以正常工作,但是当我添加ControllerProvider
时,我会出现以下错误:
Error: [ng:areq] Argument 'fn' is not a function, got Object
http://errors.angularjs.org/1.3.1/ng/areq?p0=fn&p1=not%20aNaNunction%2C%20got%Object
at REGEX_STRING_REGEXP (http://localhost:48510/Scripts/Vendor/Angular/1-angular.js:80:12)
at assertArg (http://localhost:48510/Scripts/Vendor/Angular/1-angular.js:1577:11)
at assertArgFn (http://localhost:48510/Scripts/Vendor/Angular/1-angular.js:1587:3)
at annotate (http://localhost:48510/Scripts/Vendor/Angular/1-angular.js:3417:5)
at invoke (http://localhost:48510/Scripts/Vendor/Angular/1-angular.js:4096:21)
at Object.instantiate (http://localhost:48510/Scripts/Vendor/Angular/1-angular.js:4129:23)
at http://localhost:48510/Scripts/Vendor/Angular/1-angular.js:8320:28
at compile (http://localhost:48510/Scripts/Vendor/AngularUIRouter/angular-ui-router.js:3897:28)
at invokeLinkFn (http://localhost:48510/Scripts/Vendor/Angular/1-angular.js:8081:9)
at nodeLinkFn (http://localhost:48510/Scripts/Vendor/Angular/1-angular.js:7593:11)
看起来有些未定义
服务名
可能(它说的是got对象,但看起来它未定义
,但我不擅长调试AngularJs
)
这是我的密码:
.state('abstractParent.childState', {
url: '/childState',
controllerProvider: ['myService', function (myService) {
return myService
.isSpecificMember()
.then(function (result) { //this returns a promise of a bool.
if (result.data) {
return 'SpecificController';
} else {
return 'GeneralController';
}
})
}],
templateProvider: ['myService', '$templateFactory',
function (myService, $templateFactory) {
return myService.isSpecificMember().then(function(result) {
if(result.data)
{
return $templateFactory.fromUrl('SpecificView');
} else {
return $templateFactory.fromUrl('GenericView');
}
})
}],
resolve: {
thing: ['thingService', function (thingService) {
//this is only used in one of the controllers.
return thingService.getThing();
}]
}})
编辑
基于Radim Köhlers答案的变化
.state('abstractParent.childState', {
url: '/childState',
resolve: {
controllerName: ['myService', function (myService) {
return myService.isSpecificMember().then(function (result) { //this returns a promise of a bool.
if (result.data) {
return 'SpecificController';
} else {
return 'GeneralController';
}
})
}],
thing: ['thingService', function (thingService) { //this is only used in one of the controllers.
return thingService.getThing();
}]
},
controllerProvider: ['controllerName', function (controllerName) {
return controllerName;
}],
templateProvider: ['myService', '$templateFactory', function (myService, $templateFactory) {
return myService.isSpecificMember().then(function(result) {
if(result.data)
{
return $templateFactory.fromUrl('SpecificView');
} else {
return $templateFactory.fromUrl('GenericView');
}
})
}]
})
新错误:
Error: [$injector:unpr] Unknown provider: controllerNameProvider <- controllerName
http://errors.angularjs.org/1.3.1/$injector/unpr?p0=controllerNameProvider%20%3C-%20controllerName
at REGEX_STRING_REGEXP (1-angular.js:80)
at 1-angular.js:3930
at Object.getService [as get] (1-angular.js:4077)
at 1-angular.js:3935
at getService (1-angular.js:4077)
at Object.invoke (1-angular.js:4109)
at angular-ui-router.js:3465
at processQueue (1-angular.js:12901)
at 1-angular.js:12917
at Scope.$get.Scope.$eval (1-angular.js:14110)
错误:[$injector:unpr]未知提供程序:controllerNameProvider问题是,controllerProvider
必须返回表示控制器或字符串(其名称)的对象
$stateProvider
stateConfig.controllerProvider
(可选)功能
可注入提供程序函数,返回实际的控制器或字符串
所以,我们不能回报承诺
但有一个解决办法:
有
我们可以使用内置功能resolve-执行异步操作,并通过使用controllerProvider
使其成为英雄:
resolve: {
controllerName: ['$stateParams', '$timeout','$q',
function ($stateParams, $timeout, $q)
{
var deferred = $q.defer();
$timeout(function(){
deferred.resolve('MyLazyRevealedCtrl');
},250);
return deferred.promise;
}],
},
controllerProvider:['controllerName', function (controllerName)
{
return controllerName;
}],
我们可以看到的是一个简单的示例,其中只有一个计时器(扮演异步.then()
)。它等待一段时间并返回已解析的控制器名称
控制器提供程序
然后(解决所有问题后)只获取结果,并将其作为字符串返回
检查它重点是,控制器提供程序
必须返回表示控制器
或字符串
(其名称)的对象
$stateProvider
stateConfig.controllerProvider
(可选)功能
可注入提供程序函数,返回实际的控制器或字符串
所以,我们不能回报承诺
但有一个解决办法:
有
我们可以使用内置功能resolve-执行异步操作,并通过使用controllerProvider
使其成为英雄:
resolve: {
controllerName: ['$stateParams', '$timeout','$q',
function ($stateParams, $timeout, $q)
{
var deferred = $q.defer();
$timeout(function(){
deferred.resolve('MyLazyRevealedCtrl');
},250);
return deferred.promise;
}],
},
controllerProvider:['controllerName', function (controllerName)
{
return controllerName;
}],
我们可以看到的是一个简单的示例,其中只有一个计时器(扮演异步.then()
)。它等待一段时间并返回已解析的控制器名称
控制器提供程序
然后(解决所有问题后)只获取结果,并将其作为字符串返回
检查它谢谢,我认为它可以像TemplateProvider一样接受承诺。您的解决方案听起来不错,但我想我可以在模板中添加控制器名称,因为我基于相同的逻辑。但在我们没有的情况下,您的解决方案非常好。我想说,很高兴看到您如何使用UI路由器;)伟大的有一些限制,但如果我们能轻松解决它们……;)下面是如何使用“真正的动态控制器解析器”的更复杂示例。。。享受用户界面路由器,先生!奇怪的是,我可以在您的示例中看到这一点,但是我得到了controllerName的未知提供程序错误:[$injector:unpr]未知提供程序:controllerName提供程序这意味着,在您的示例中,代码中的解析返回“controllerName”。。。而不是“SpecificController”
。。。你能查一下吗?我猜这只是一个输入错误……不,我认为这是注入控制器提供程序
的问题,我的解析方法与您的相同,解析为名为控制器名称
的属性。然后我将ControllerName
属性注入到提供程序中,我从未触及ControllerProvider
中的断点。谢谢,我认为它可以像TemplateProvider一样接受承诺。您的解决方案听起来不错,但我想我可以在模板中添加控制器名称,因为我基于相同的逻辑。但在我们没有的情况下,您的解决方案非常好。我想说,很高兴看到您如何使用UI路由器;)伟大的有一些限制,但如果我们能轻松解决它们……;)下面是如何使用“真正的动态控制器解析器”的更复杂示例。。。享受用户界面路由器,先生!奇怪的是,我可以在您的示例中看到这一点,但是我得到了controllerName的未知提供程序错误:[$injector:unpr]未知提供程序:controllerName提供程序这意味着,在您的示例中,代码中的解析返回“controllerName”。。。而不是“SpecificController”
。。。你能查一下吗?我猜这只是一个输入错误……不,我认为这是注入控制器提供程序
的问题,我的解析方法与您的相同,解析为名为控制器名称
的属性。然后我将ControllerName
属性注入到提供程序中,我从未碰到ControllerProvider
中的断点。