Angular 1.5 вложенный компонент связывает родительское значение

Я новичок в angularjs. Я пытаюсь вложенный компонент angular 1.5. Могу ли я привязать свойство родительского компонента в дочернем компоненте.

Ex:

<div ng-app='cbsApp' ng-controller='cbsCnt as ct'>
    <cbs-cus-comp com-bind='ct.name'>
        <child child-com-bind='cbsCusCompCntAs.name'></child>
    </cbs-cus-comp>
</div>

Я могу получить КТ.значение имени в com-bind. Но не могу получить cbsCusCompCntAs.имя в child-com-bind. (cbsCusCompCntAs-это контроллер cbs-cus-comp)

Рабочая Plunker : https://plnkr.co/edit/axQwTn?p=preview

спасибо заранее.

3 ответов


в первом случае вы ссылаетесь непосредственно на область контроллера через controllerAs.

при использовании компонентов в angular 1.5 вы можете получить свой родительский компонент через require что сделает свойства родителя доступными после $onInit по состоянию на Документация По Компонентам:

обратите внимание, что необходимые контроллеры не будут доступны во время создание экземпляра контроллера, но они гарантированно будут доступно только перед выполнением метода $onInit!

в вашем конкретном случае вы можете обновить ребенок компонент для требования родителя:

var child = {
    require     :  {parentComp:'^cbsCusComp'},
    template    :  'Child : <b{{cbsCusChildCompCntAs.childComBind}}</b>',
    controller  :  cbsCusChildCompCnt,
    controllerAs:  'cbsCusChildCompCntAs'
    };

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

function cbsCusChildCompCnt(){
  this.$onInit = function() {
    this.childComBind = this.parentComp.name;
  };
}

обновил plunker составляет здесь.


Вау... какой замечательный пример... Мне потребовалось время, чтобы проанализировать его... Итак, я написал свою собственную (я думаю, немного более читаемую) версию. Я действительно не знаю, как работать с Plunker... вот код... выдержка из моего индекса.html файл

<div ng-controller='appCtrl as ctrl'>
    <parent bind-id='ctrl.name'>
        <child bind-toid='parentCtrlAs.name'></child>
    </parent>
</div>

The .файл JS

(function () {
'use strict';

var 
    parentComponent =   
    {
        bindings    :   
        {
            bindId:'='
        },
        controller  : parentCtrl,
        controllerAs: 'parentCtrlAs',
        restrict    : 'A',
        transclude  : true,
        templateUrl : 'parent.html',
    };

var 
    childComponent =    
    {
        controller  : childCtrl,
        controllerAs: 'childCtrlAs',
        restrict    : 'A',
        require     :
        {
            myParent    :'^parent'
        },
        templateUrl :   'child.html',
};


angular
    .module('app', [])
    .controller('appCtrl'   , appCtrl)
    .component('parent'     , parentComponent)
    .component('child'      , childComponent);


function appCtrl(){
    this.name = 'Main..';
}

function childCtrl(){
    this.$onInit = function() {
        this.bindToid = this.myParent.name;
    };
}

function parentCtrl(){
    this.name   =   'Parent Component';
}

})();

надеюсь, это поможет, С уважением, Джонни!--5-->


хотя использование параметра "require" работает, он создает тесно связанную связь между компонентом, действующим как дочерний, который использует параметр "require", и компонентом, действующим как родительский, который потребляет дочерние функции.

лучшее решение-использовать компонентную связь, как показано здесь.

в основном вы определяете функцию привязки в определении дочернего компонента, например,

angular.module('app').component('componentName', {
templateUrl: 'my-template.html',
bindings: {
       myFunction: '&'
},
controller: function() { // Do something here}
});

затем в родительская разметка вы предоставляете функцию для вызова,

Родительский HTML

<user-list select-user="$ctrl.selectUser(user)">
</user-list>

наконец, в Родительском контроллере укажите реализацию функции selectUser.

вот работает цок.