Javascript AngularJS+;路由+;决定
我得到了这个错误: 错误:错误:[$injector:unpr]$injector/unpr?p0=HttpResponseProvider%20%3C-%20HttpResponse%20%3C-%20DealReads 注入器未知提供程序 这是我的路由器(ui.router): 这是我的控制器:Javascript AngularJS+;路由+;决定,javascript,angularjs,angular-ui-router,angularjs-routing,Javascript,Angularjs,Angular Ui Router,Angularjs Routing,我得到了这个错误: 错误:错误:[$injector:unpr]$injector/unpr?p0=HttpResponseProvider%20%3C-%20HttpResponse%20%3C-%20DealReads 注入器未知提供程序 这是我的路由器(ui.router): 这是我的控制器: function DealerLeads($scope, HttpResponse) { alert(JSON.stringify(HttpResponse)); } 以下是我的决心: D
function DealerLeads($scope, HttpResponse) {
alert(JSON.stringify(HttpResponse));
}
以下是我的决心:
DealerLeads.resolve = {
HttpResponse: function ($http) {
...
}
}
数据正在进入控制器,我在警报中看到它。但是,在控制器完成之后,在视图渲染期间(我认为),问题似乎正在发生
最终渲染视图有两个控制器:一个主控制器位于主体标记中,另一个控制器位于主体标记内的“DealReads”。我已尝试删除主控制器,但问题仍然存在
我做错了什么?是否需要更多代码来理解/解决此问题?在绑定到路由的控制器中使用路由解析参数作为依赖项注入时,不能将该控制器与
ng controller
指令一起使用,因为名为HttpResponse
的服务提供商不存在。当路由器在其各自的部分视图中实例化要绑定的控制器时,它会注入一个动态依赖项
只需从视图中删除ng controller=“DealerLeads”
,并确保视图是由stateleads
@templateUrl:“views/leads.html”
呈现的html的一部分。路由器会将其绑定到模板,以便您解析动态依赖关系HttpResponse
。如果要使用controllerAs,可以在路由器本身中指定为:-
controller: 'DealerLeads',
controllerAs: 'leads' //Not sure if this is supported by ui router yet
或
当您这样做时:
.state('leads', {
url: "/leads",
templateUrl: "views/leads.html",
data: { pageTitle: 'Dealer Leads' },
controller: 'DealerLeads',
resolve: DealerLeads.resolve
})
确保
DealerLeads
可在定义路线的位置访问。更好的做法是将路由定义移动到其自己的控制器文件中,以便它们都位于一个位置。只要可能,尤其是在路由的局部视图中,最好不要启动指令,而是使用路由来实例化和绑定该模板的控制器。它提供了更多的可重用性,因为视图作为一个整体,不与控制器名称紧密耦合,而只与其契约紧密耦合。所以我不会担心删除路由器可以实例化控制器的ng controller
指令。我不完全理解您的问题,也不是像@PSL这样的专家
如果您只想将一些数据传递到控制器,下面的代码可能会对您有所帮助
我从项目中复制了一段代码:
.state('masthead.loadTests.test',{
url: '/loadTests/:id',
templateUrl: 'load-tests/templates/load-test-entity.tpl.html',
controller: 'loadTestEntityCtrl',
data: { pageTitle: 'loadTests',
csh: '1005'
},
resolve: {
// Get test entity data before enter to the page (need to know running state)
LoadTestEntityData: [
'$stateParams',
'$state',
'LoadTestEntity',
'LoggerService',
'$rootScope',
function ($stateParams, $state, LoadTestEntity, LoggerService, $rootScope) {
// Get general data
return LoadTestEntity.get({id: $stateParams.id},function () {
},
// Fail
function () {
// When error navigate to homepage
LoggerService.error('error during test initiation');
$state.go('masthead.loadTests.list', {TENANTID: $rootScope.session.tenantId});
}).$promise;
}
]
}
})
这里LoadTestEntityData是我们注入控制器的数据,
LoadTestEntity和LoggerService是构建数据所需的服务
.factory('LoadTestEntity', ['$resource', function ($resource) {
return $resource(
'/api/xxx/:id',
{id: '@id'},
{
create: {method: 'POST'},
update: {method: 'PUT'}
}
);
}])
希望有帮助
主体标签中的一个主控制器,以及该标签中的第二个控制器“DealReads”
-->您是否对ng控制器使用DealReads
?还是让路由器来实例化它?请显示完整的错误消息?它们都在各自的标记中分别声明:这是错误的,您不能这样做,好吧,那么我应该怎么做?我从未见过将控制器属性用作解决方案的一部分。我不是100%确定它不会工作,但考虑到你的错误信息,我认为不会。尝试用“正常”语法替换resolve属性,看看是否有效。谢谢!!!!非常感谢。在过去的6个小时里,我一直在努力解决这个问题,重新编写了这么多代码,我的大脑很痛@不客气,希望我能提供一些见解:)对我对这一点还相当陌生,随着时间的推移不断学习。对我来说,很多障碍都发生在这样的细微差别上。在我今天的所有搜索中,我没有发现任何地方明确声明不显式设置ng控制器属性。它会自动将其绑定到视图
.state('masthead.loadTests.test',{
url: '/loadTests/:id',
templateUrl: 'load-tests/templates/load-test-entity.tpl.html',
controller: 'loadTestEntityCtrl',
data: { pageTitle: 'loadTests',
csh: '1005'
},
resolve: {
// Get test entity data before enter to the page (need to know running state)
LoadTestEntityData: [
'$stateParams',
'$state',
'LoadTestEntity',
'LoggerService',
'$rootScope',
function ($stateParams, $state, LoadTestEntity, LoggerService, $rootScope) {
// Get general data
return LoadTestEntity.get({id: $stateParams.id},function () {
},
// Fail
function () {
// When error navigate to homepage
LoggerService.error('error during test initiation');
$state.go('masthead.loadTests.list', {TENANTID: $rootScope.session.tenantId});
}).$promise;
}
]
}
})
.factory('LoadTestEntity', ['$resource', function ($resource) {
return $resource(
'/api/xxx/:id',
{id: '@id'},
{
create: {method: 'POST'},
update: {method: 'PUT'}
}
);
}])