Angular 组件绑定未定义
Angular Component Bindings Undefined
我正在尝试将我的第一个 angular 组件与 ngRoute 放在一起,但到目前为止我无法获取要解析的数据。
配置:
.when('/myfirstcomponent', {
template: '<myfirstcomponent claimKeys="$resolve.claimKeys"></myfirstcomponent>',
resolve: {
claimKeys: ['$http', function($http) {
$http.get('server/claimkeys.json').then((response) => {
var claimKeys = response.data.DATASET.TABLE;
return claimKeys;
});
}]
}
})
组件:
.component('myfirstcomponent', {
bindings: {
'claimKeys': '@'
},
templateUrl: 'components/component.html',
controller: [function() {
this.$onInit = function() {
var vm = this;
console.log(vm.claimKeys);
};
}]
组件的 html 仅包含一个带有一些随机文本的 p 元素。
调试时我可以看到我正在检索数据,但我无法在组件控制器上访问它...
编辑:感谢下面接受的答案,我已经解决了我的问题。它与异步调用的问题无关,但与我定义路由和组件的方式有关。请参阅下面的代码进行修复。再次感谢。
一些问题:
- 如你所说 claimKeys 在指令中应该是 claim-keys
- 它的绑定应该是“<”(单向绑定)或“=”(双向绑定),而不是“@”,它只是将引号之间的字符串传递给指令
- 在你指令的控制器中
var vm = this;
应该在上面
$onInit 函数而不是函数内部(作用域不同)
resolve.claimkeys
应该 return $http 的承诺而不只是调用
它
- claimKeys 应该被路由器的控制器作为注入接收并传递给它的模板
controllerAs: '$resolve'
路由器应该使用
app.component('myfirstcomponent', {
bindings: {
'claimKeys': '='
},
template: 'components/component.html',
controller: function() {
var vm = this;
this.$onInit = function() {
console.log(vm.claimKeys);
};
}
});
app.config(function ($stateProvider) {
$stateProvider.state('myfirstcomponent', {
url: '/myfirstcomponent',
template: '<myfirstcomponent claim-keys="$resolve.claimKeys"></myfirstcomponent>',
resolve: {
claimKeys: ['$http', function($http) {
return $http.get('claimkeys.json').then((response) => {
return response.data.DATASET.TABLE;
});
}]
},
controller: function (claimKeys) {
this.claimKeys = claimKeys;
},
controllerAs: '$resolve'
})
});
plunker:http://plnkr.co/edit/Nam4D9zGpHvdWaTCYHSL?p=preview,我在这里使用 .state 而不是 .when 用于路由。
我正在尝试将我的第一个 angular 组件与 ngRoute 放在一起,但到目前为止我无法获取要解析的数据。 配置:
.when('/myfirstcomponent', {
template: '<myfirstcomponent claimKeys="$resolve.claimKeys"></myfirstcomponent>',
resolve: {
claimKeys: ['$http', function($http) {
$http.get('server/claimkeys.json').then((response) => {
var claimKeys = response.data.DATASET.TABLE;
return claimKeys;
});
}]
}
})
组件:
.component('myfirstcomponent', {
bindings: {
'claimKeys': '@'
},
templateUrl: 'components/component.html',
controller: [function() {
this.$onInit = function() {
var vm = this;
console.log(vm.claimKeys);
};
}]
组件的 html 仅包含一个带有一些随机文本的 p 元素。
调试时我可以看到我正在检索数据,但我无法在组件控制器上访问它...
编辑:感谢下面接受的答案,我已经解决了我的问题。它与异步调用的问题无关,但与我定义路由和组件的方式有关。请参阅下面的代码进行修复。再次感谢。
一些问题:
- 如你所说 claimKeys 在指令中应该是 claim-keys
- 它的绑定应该是“<”(单向绑定)或“=”(双向绑定),而不是“@”,它只是将引号之间的字符串传递给指令
- 在你指令的控制器中
var vm = this;
应该在上面 $onInit 函数而不是函数内部(作用域不同) resolve.claimkeys
应该 return $http 的承诺而不只是调用 它- claimKeys 应该被路由器的控制器作为注入接收并传递给它的模板
controllerAs: '$resolve'
路由器应该使用app.component('myfirstcomponent', { bindings: { 'claimKeys': '=' }, template: 'components/component.html', controller: function() { var vm = this; this.$onInit = function() { console.log(vm.claimKeys); }; } }); app.config(function ($stateProvider) { $stateProvider.state('myfirstcomponent', { url: '/myfirstcomponent', template: '<myfirstcomponent claim-keys="$resolve.claimKeys"></myfirstcomponent>', resolve: { claimKeys: ['$http', function($http) { return $http.get('claimkeys.json').then((response) => { return response.data.DATASET.TABLE; }); }] }, controller: function (claimKeys) { this.claimKeys = claimKeys; }, controllerAs: '$resolve' }) });
plunker:http://plnkr.co/edit/Nam4D9zGpHvdWaTCYHSL?p=preview,我在这里使用 .state 而不是 .when 用于路由。