如何使用组件将值传递给控制器​​?

时间:2017-06-20 00:02:57

标签: javascript angularjs

我正在尝试通过我的组件将值传递给我的控制器,但我仍然得到这个未定义的消息。我错过了什么吗?

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 :(
    }

1 个答案:

答案 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以来可用的绑定。与=的区别在于   不监视组件范围中的绑定属性   表示是否为组件中的属性分配新值   范围,它不会更新父范围

https://docs.angularjs.org/guide/component