我正在尝试通过我的组件将值传递给我的控制器,但我仍然得到这个未定义的消息。我错过了什么吗?
myhtml.html
<my-component item="value1"></my-component>
<my-component item="value2"></my-component>
<my-component item="value3"></my-component>
mycomponent.js
angular
.module('mycomponent.component', [
'mycomponent.controller'
])
.component('myComponent', {
templateUrl: 'components/mycomp/mycomp.component.html',
controller: 'ComponentController',
controllerAs: 'componentVM',
replace: true,
bindings: {
item: '='
}
});
mycontroller.js
angular
.module('mycomponent.controller', [])
.controller('ComponentController', ComponentController);
ComponentController.$inject = [];
function ComponentController() {
var vm = this;
console.log('item value> ' + vm.item); // This is got undefined :(
}
答案 0 :(得分:1)
正如@mhodges的评论中所建议的那样,把你所有的逻辑都放在一边
在$onInit
钩子里面。
当初始化所有绑定时,$onInit
作为组件生命周期的一部分被触发。
var self = this;
self.$onInit = function(){
console.log('item value> ' + self.item);
}
回到你的代码,如果value1
是基本类型,你应该使用单向绑定@
(基本类型不能使用双向绑定,因为它们不是引用)< / p>
bindings: {
item: '@'
}
<my-component item="value1"></my-component>
在item
是对象的情况下,要将组件与外部环境分离,最好使用单向绑定<
,
bindings: {
item: '<'
}
这甚至会遵循Angular&gt;的指导原则。 1.5旨在基于组件的架构。
来自Angular 1.5 doc:
输入应使用&lt;和@ bindings。 &lt;符号表示单向 自1.5以来可用的绑定。与=的区别在于 不监视组件范围中的绑定属性 表示是否为组件中的属性分配新值 范围,它不会更新父范围