在AngularJS中从父级命令特定的子级组件

Bur*_*NLI 4 javascript angularjs angularjs-components

我正在使用AngularJS 1.5.8。我有“ myParent”和“ myChild”组件。我认为,我的父母中有1个父母和2个孩子。所以我的问题是:我想在“ myParent”组件的控制器中拥有子“ myChild”组件的实例,并仅向特定的孩子发出命令 makePrimary(),或者像这样...我如何实现这个目标?

JS:

//var myApp = 
angular.module('myApp', ['myChild', 'myParent']);

angular.
module('myChild', []).
component('myChild', {
  template: '<div class="panel panel-default">' +
    '<div class="panel-heading">Child</div>' +
    '<div class="panel-body">' +
    'Child content...' +
    '</div>' +
    '</div>',
  controller: ['$scope', '$element',
    function myChildController($scope, $element) {

    }
  ]
});

angular.
module('myParent', ['myChild']).
component('myParent', {
  template: '<div class="panel panel-default">' +
    '<div class="panel-heading">Parent</div>' +
    '<div class="panel-body">' +
    '<my-child></my-child>' +
    '<hr />' +
    '<my-child></my-child>' +
    '</div>' +
    '</div>',
  controller: ['$scope', '$element',
    function myParentController($scope, $element) {

    // TODO: MAKE CHILD-2 ".panel-primary" CLASS IN HERE.
    // BUT ONLY A SPECIFIC CHILD!

    }
  ]
});
Run Code Online (Sandbox Code Playgroud)

HTML:

<div ng-app="myApp" class="container">
  <my-parent></my-parent>
</div>
Run Code Online (Sandbox Code Playgroud)

用于示例的JSFIDDLE:https ://jsfiddle.net/zhc12t1a/4/

我检查了一些相关的问题,例如:

但是我找不到一种简单的架构来实现此目标的正确方法。

编辑

我知道一些复杂的方法(从体系结构的角度来看),但我不想使用它们。例如:

使用$ parent或

在myParentController中:

$scope.makeChild1Primary = function () {} 
Run Code Online (Sandbox Code Playgroud)

在myParent模板中:

<my-child make-primary="makeChild1Primary"></my-child>
Run Code Online (Sandbox Code Playgroud)

在myChild组件中

//...
var ctrl = this;
ctrl.makePrimary = function () { /* MAKE PRIMARY LOGIC HERE... */ }
//...
,bindings: {
makePrimary: '='
}
Run Code Online (Sandbox Code Playgroud)

ggr*_*nig 5

如“ AngularJS-访问子范围 ”中所述,无法从父级访问子级作用域,因为AngularJS处理从子级到父级的属性,而不是相反。

如果您不想将子元素的ng-class绑定到父元素的属性或使用公共服务,则必须明确地将子元素的作用域添加到父属性,如下所示:

function myParentController($scope, $element) {
    $scope.children = [];
    ...
}

function myChildController($scope, $element) {
    $scope.$parent.children.push($scope);
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以像这样从父级访问所有子级:

$scope.children[1].isPrimary = true;
Run Code Online (Sandbox Code Playgroud)

在HTML中,您可以将面板的类绑定到属性“ isPrimary”,如下所示:

<div class="panel panel-default" ng-class="isPrimary ? 'panel-primary' : ''">
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到示例的完整实现:https : //jsfiddle.net/81eesouy/7/