【问题标题】:Angularjs 1.5 Nested Components bindingsAngularjs 1.5 嵌套组件绑定
【发布时间】:2016-12-24 01:27:35
【问题描述】:

我试图将一个值从一个父组件传递给他的嵌套子组件,角度为1.5

该值可以从父母那里更新,但孩子不能编辑它,只是显示它。那么单向绑定'对吗?

而且我不能在父组件声明中直接传递子组件,因为父组件也会有其他用途。

关键是我的父组件存储了公共数据,但是它们 孩子们会以不同的方式使用它。

并且父组件会被多次使用,不同的 孩子,这就是为什么我不能通过父母里面的孩子 宣言。为了自动更新,我需要绑定信息,当 父母更新数据,必须由孩子反映

HTML

<parent-component ng-transclude>
  <child-component name="$ctrl.characters.arya"></child-component>
  <child-component name="$ctrl.characters.john"></child-component>
</parent-component>

JS

   // Parent Component declaration
// /////////////////////////
(function() {
  'use strict';
  angular
    .module('app')
    .component("parentComponent", {
      transclude: true,
      controller: "ParentComponentController",
      template: 
        '<div class="parent-c"></div>'
    });
 })();



// Parent Component Controller
// /////////////////////////
(function() {
  'use strict';
  angular
    .module('app')
    .controller('ParentComponentController', ParentComponentController);

  function ParentComponentController() {
    var $ctrl = this;
    $ctrl.characters = {};
    $ctrl.characters.arya = "Arya Stark";
    $ctrl.characters.john = "John Snow";
  }
})();




//CHILD Component declaration
// /////////////////////////
(function() {
  'use strict';
  angular
    .module('app')
    .component("childComponent", {
      bindings: {
        name: '<'
      },
      controller: "ChildComponentController",
      template: 
        '<div class="child-c"' +
          '<h3>Im a child Component</h3>' +
          '<p><strong>Name: </strong>{{$ctrl.name}}</p>' +
        '</div>'
    });
 })();



// CHILD Component Controller
// /////////////////////////
(function() {
  'use strict';
  angular
    .module('app')
    .controller('ChildComponentController', ChildComponentController);

  function ChildComponentController() {
    var $ctrl = this;
  }
})();

Check the WORKING SAMPLE on plunkr


require 属性用于组件通信,但我尝试使用它但没有成功:(,这里需要一点亮点。

【问题讨论】:

  • 您想将名称作为属性传递给组件(通过绑定)还是通过从父级继承(通过 require)?

标签: angularjs inheritance angularjs-1.5 angular-components


【解决方案1】:

您必须使用:&lt;child-component name="$parent.$ctrl.characters.arya"&gt;&lt;/child-component&gt;将值从父组件传递给嵌套的子组件

【讨论】:

  • 嗨!感谢您的回答。这可行,但似乎太容易成为现实,使用它是否有一些不好的性能或不好的做法?
  • 最好有自包含元素。您可以轻松地在另一个项目中使用它们。但一般如果你需要外部信息,注入或绑定它们。
  • 关键是我的父组件存储了公共数据,但他们的孩子会以不同的方式使用它们。并且父组件将被多次使用,具有不同的孩子,这就是为什么我不能在父声明中传递孩子。我需要绑定信息,出于自动更新的目的,当父母更新数据时,必须由孩子反映。
【解决方案2】:

您的代码存在不同的问题:

  function ParentComponentController() {
    var $ctrl = this;
    $ctrl.characters = {};
    $ctrl.characters.arya = "Arya Stark";
    $ctrl.characters.john = "John Snow";
  }

您不需要为此定义局部变量,因为不会在任何地方更改上下文。

controller: "ParentComponentController",

不要给这个属性传递字符串,传递一个引用:

controller: ParentComponentController,

那么如果你想通过父控制器传递name,子组件中有require:

require: { parent: '^^parentComponent' },

现在您已经将父控制器绑定到子控制器,您可以使用它:

{{$ctrl.parent.characters.arya}}

在模板中。

http://plnkr.co/edit/3PRgQSGdBEIDKuUSyDLY?p=preview

如果需要将名称作为属性传递给子组件,则必须将子组件放在父组件的模板中,以便调用 $ctrl。

http://plnkr.co/edit/1H7OlwbumkNuKKrbu4Vr?p=preview

【讨论】:

  • 嗨!感谢您的回复。在 plunkr 上,我将所有内容都放在一个文件中,但在本地,每个组件都有 3 个文件:1 个 component.js、1 个 component.controller.js、1 个 component.template.html 这就是我定义局部变量并使用字符串而不是引用的原因.有一种方法可以将 Name 作为属性,但在父模板之外?就像将名称存储在子组件变量或类似的东西中。
猜你喜欢
  • 2016-10-09
  • 2016-07-03
  • 1970-01-01
  • 2016-12-12
  • 2017-06-17
  • 1970-01-01
  • 2017-03-18
  • 2017-08-10
  • 2020-08-29
相关资源
最近更新 更多