Angular 1.5.x - 嵌套组件的问题

Angular 1.5.x - Issue with nested components

首先,我正在使用 components

我有这个 "parent" component:

(function() {
  'use strict';

  angular
    .module('parentModule', [])
    .component('parent', {
      templateUrl: 'parent.tpl.html',
      controller: ParentCtrl,
        transclude: true,
        bindings: {
            item: '='
        }
    });

  function ParentCtrl() {
    var vm = this;
    vm.item = {
      'id': 1,
      'name': 'test'
    };
  }
})();

我只是想与另一个组件共享 object item,如下所示:

(function() {
  'use strict';

  angular
    .module('childModule', [])
    .component('child', {
      templateUrl: 'child.tpl.html',
      controller: ChildCtrl,
      require: {
        parent: '^item'
      }
    });

  function ChildCtrl() {
    console.log(this.parent)
    var vm = this;

  }
})();

视图(父视图):

Parent Component:

<h1 ng-bind='$ctrl.item.name'></h1>
<child></child>

查看(儿童):

Child component:

Here I want to print the test that is in the parent component
<h2 ng-bind='$ctrl.item.name'></h2>

实际上我遇到了以下错误:

Expression 'undefined' in attribute 'item' used with directive 'parent' is non-assignable!

这里DEMO可以更好地说明情况

你能向我解释一下如何让它发挥作用吗?

您的 child 应该通过绑定将 项目 作为输入。

(function() {
  'use strict';

  angular
    .module('childModule', [])
    .component('child', {
      templateUrl: 'child.tpl.html',
      controller: ChildCtrl,
       bindings: {
        item: '='
       }
    });

  function ChildCtrl() {
    console.log(this.parent)
    var vm = this;

  }
})();

因此您的 parent 模板将如下所示

<h1 ng-bind='$ctrl.item.name'></h1>
<child item="$ctrl.item"></child>

其余的应该是一样的。

您需要从您的父组件中删除 bindingsbindings 绑定到组件控制器就像 scope 绑定到指令的范围。您没有向 <parent></parent> 传递任何内容,因此您必须将其删除。

然后您的子组件 require 是父组件,而不是项目。 所以

  require: {
    parent: '^parent'
  }

当然子模板应该修改为:

<h2 ng-bind='$ctrl.parent.item.name'></h2>

最后,如果您想从子控制器中记录父控制器中的项目,则必须这样写:

  function ChildCtrl($timeout) {
    var vm = this;
    $timeout(function() {
      console.log(vm.parent.item);
    });
  }

我的组件中从不需要超时,所以我可能错过了一些明显的东西。

http://plnkr.co/edit/0DRlbedeXN1Z5ZL45Ysf?p=preview

编辑:

哦,我忘了,你需要使用 $onInit 钩子:

this.$onInit = function() {
  console.log(vm.parent.item);
}