2016-08-17 8 views
1

пытаются передать значение из родительской-компоненты к его вложенному ребенку-компоненту в угловом 1.5Angularjs 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


требуется Атрибут предназначен для связи компонентов, но я стараюсь использовать его без успеха :(, нужен кусок света здесь.

+0

вы хотите передать имя в качестве атрибута к компоненту (через привязки) или по наследству от родителей (через) требуют ли? – gyc

ответ

2

вы должны использовать: <child-component name="$parent.$ctrl.characters.arya"></child-component> передать значение из родительской компоненты к его вложенным ребенку-компоненту

+0

Привет! спасибо за Ваш ответ. Это работает, но кажется слишком легким, чтобы быть реальным, есть ли плохая производительность или плохая практика об использовании этого? –

+0

Лучше иметь автономный элемент. Вы можете легко использовать их в другом проекте. Но обычно, если вам нужна внешняя информация, вводите их или связывайте. – DMCISSOKHO

+0

Точка моего родительского компонента хранит общие данные, но дети будут использовать их по-разному. И родительский компонент будет использоваться в несколько раз с разными дочерними элементами, поэтому я не могу передать дочерние элементы внутри родительского объявления. Мне нужно связать информацию, для целей автоматического обновления, когда родители обновляют данные, должны отражаться детьми. –

1

Существует различные проблемы, связанные с вашим кодом:

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

Вам не нужны определите для этого локальную переменную, поскольку нигде не изменяйте контекст.

controller: "ParentComponentController", 

Не передать строку к этому свойству, передать ссылку:

controller: ParentComponentController, 

Затем, если вы хотите передать name через родительский контроллер с потребуем ребенка компонента:

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

Теперь, когда у вас есть родительский контроллер, связанный с ребенком, вы можете использовать его с:

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

в шаблоне.

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

Если вам нужно передать имя как атрибут для ваших дочерних компонентов, вы должны поместить дочерние элементы внутри шаблона родителя, так что вы можете позвонить $ ctrl.

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

+0

Привет! Спасибо за ваш ответ. На plunkr у меня есть все в одном файле, но в локальном я имею 3 файла для каждого компонента: 1 component.js, 1 component.controller.js, 1 component.template.html, поэтому я определил локальную переменную и использую строку вместо Справка. Существует способ получить имя как атрибут, но вне родительского шаблона? например, сохранить имя в переменной дочернего компонента или что-то в этом роде. –