我面临着将控制器转换为准备Angular 2应用程序的组件的问题,但是迁移不顺利的问题,我有ui路由器在状态之间路由并在几个控制器中使用resolve,带控制器的版本正在运行,但组件的版本现在正在运行,我遵循了很多指南,似乎我对代码做得很好,但它不适合我。
我有以下模块与控制器:
(function () {
'use strict';
angular
.module('app.sample', [])
.config(config);
/** @ngInject */
$stateProvider
.state('app.sample', {
url : '/sample',
views : {
'content@app': {
templateUrl: 'app/main/sample/sample.html',
controller : 'SampleController as vm'
}
},
resolve: {
SampleData: function (myService) {
return myService.getSample(); // I return a promise here
}
}
});
}
})();
控制器:
(function ()
{
'use strict';
angular
.module('app.sample')
.controller('SampleController', SampleController);
/** @ngInject */
function SampleController(SampleData)
{
var vm = this;
vm.helloText = SampleData.data.helloText;
}
})();
以上代码运行良好,但在将其作为组件后,它变成了这样:
(function () {
'use strict';
angular
.module('app.sample', [])
.config(config);
/** @ngInject */
function config($stateProvider) {
// State
$stateProvider
.state('app.sample', {
url: '/sample',
views: {
'content@app': {
template: '<sample></sample>'
}
},
resolve: {
SampleData: function (myService) {
return myService.getSample(); // I return a promise here
}
}
});
}
})();
组件:
(function () {
'use strict';
angular
.module('app.sample')
.component('sample', {
templateUrl: 'app/main/sample/sample.html',
bindings: {
},
controller: Sample
});
/** @ngInject */
function Sample(SampleData) {
var $ctrl = this;
$ctrl.helloText = SampleData.data.helloText;
}
})();
但现在它不起作用并给我以下错误:
Error: [$injector:unpr] Unknown provider: SampleDataProvider <- SampleData
http://errors.angularjs.org/1.5.7/$injector/unpr?p0=SampleDataProvider%20%3C-%20SampleData
at angular.js:68
at angular.js:4502
at Object.getService [as get] (angular.js:4655)
at angular.js:4507
at getService (angular.js:4655)
at injectionArgs (angular.js:4679)
at Object.invoke (angular.js:4701)
at $controllerInit (angular.js:10234)
at nodeLinkFn (angular.js:9147)
at angular.js:9553
我在 bower.json 中的依赖关系:
"dependencies": {
"angular": "1.5.7",
"angular-animate": "1.5.7",
"angular-aria": "1.5.7",
"angular-cookies": "1.5.7",
"angular-material": "1.1.0-rc.5",
"angular-messages": "1.5.7",
"angular-resource": "1.5.7",
"angular-sanitize": "1.5.7",
"angular-ui-router": "1.0.0-beta.1",
"jquery": "2.2.4",
"mobile-detect": "1.3.2",
"moment": "2.13.0"
}
知道问题是什么,我缺少什么?
答案 0 :(得分:24)
最后解决了它,我误解了组件是如何工作的。
首先我将SampleData
更改为sampleData
,Pascal Case,但首字母小。
然后在module
内,我将template
更改为template: '<sample sample-data="$resolve.sampleData"></sample>'
和resolve
:
resolve: {
sampleData: function (msApi) {
return msApi.resolve('sample@get');
}
}
对于component
我也改变了绑定:
bindings: {
sampleData: '='
},
在controller
的{{1}}内,我从签名中删除了component
,并将其称为SampleData
。
所以现在的最终代码如下: 对于模块:
$ctrl.helloText = $ctrl.sampleData.data.helloText;
组件是这样的:
(function () {
'use strict';
angular
.module('app.sample', [])
.config(config);
/** @ngInject */
function config($stateProvider) {
// State
$stateProvider
.state('app.sample', {
url: '/sample',
views: {
'content@app': {
template: '<sample sample-data="$resolve.sampleData"></sample>'
}
},
resolve: {
sampleData: function (myService) {
return myService.getSample(); // I return a promise here
}
}
});
}
})();
最后工作了。
修改强> P.S。:在问答范围之外,如果您也使用没有状态的组件,您需要在控制器内部获取数据而不是解析,因此您可以在任何地方调用组件。
答案 1 :(得分:0)
'use strict';
angular
.module('app.sample')
.controller('SampleController', SampleController);
/** @ngInject */
function SampleController(SampleData)
{
var vm = this;
vm.helloText = SampleData.data.helloText;
}
不要像上面那样给出,而是尝试注入&#39; SampleData&#39;在你的控制器中解决,如下所示:
'use strict';
angular
.module('app.sample')
.controller('SampleController', ['SampleData', SampleController]);
/** @ngInject */
function SampleController(SampleData)
{
var vm = this;
vm.helloText = SampleData.data.helloText;
}
希望对你有用