Angularjs 在Angular 1.x中传递组件或指令的有效方法

Angularjs 在Angular 1.x中传递组件或指令的有效方法,angularjs,angularjs-directive,components,watch,Angularjs,Angularjs Directive,Components,Watch,如下图所示: 我想改进组件通信方法…我认为这种方法效率不高 单击tabsetComponent以发出事件时,父控制器将捕获此事件,并更改rootScope变量。正在tableComponent中使用$watch rootScope变量触发http获取数据函数 有谁能有更好、更有效的方法来交流同级组件吗 组件间通信的公认AngularJS方法是使用组件属性进行通信 <div ng-controller="rootCtrl as vm"> <tab-set-compon

如下图所示:

我想改进组件通信方法…我认为这种方法效率不高

单击tabsetComponent以发出事件时,父控制器将捕获此事件,并更改rootScope变量。正在tableComponent中使用$watch rootScope变量触发http获取数据函数


有谁能有更好、更有效的方法来交流同级组件吗

组件间通信的公认AngularJS方法是使用组件属性进行通信

<div ng-controller="rootCtrl as vm">

    <tab-set-component tsc-click="vm.fn($event, data)">
    </tab-set-component>

    <table-component="vm.tableData">
    </table-component>

</div>
上面的示例避免了混乱
$rootScope
。所有业务逻辑和数据都包含在控制器中

控制器为
表格组件设置初始数据,从
选项卡集组件
接收单击事件,发出HTTP请求,处理错误,并将数据更新到
表格组件


更新--使用表达式绑定 另一种方法是使用表达式绑定来传递事件:

<header-component view="root.view" on-view-change="root.view = $event.view">
</header-component>

<main-component view="root.view"></main-component>
有关详细信息,请参阅


另请参见

在html中,您使用来自根控制器的vm.fn,对吗?因此您的建议是它应该调用根控制器上定义的click方法,click方法将触发根范围上定义的http请求函数,然后获取表组件数据,然后绑定表组件属性上的数据。您认为在根控制器中定义http fetch函数更有效吗?通过这种方式,我们不需要使用任何事件方法,对吗?请参阅添加的控制器示例感谢您的详细解释:)另一个问题,如果根范围中有许多组件,我们将在根控制器中定义许多函数,对吗?根控制器太重,无法有效执行?上面的控制器示例未使用
$rootScope
。它使用的子范围为
$rootScope
。您可以通过将
{{'scope-id'=+$id}}
放入其模板来检查这一点<代码>$rootScope
的ID为1。子作用域的数字从1开始递增。很抱歉,我键入了错误的单词…实际上,我想说,如果我在根控制器中定义了根控制器中的组件需要的许多函数,那么根控制器会太重吗?
<header-component view="root.view" on-view-change="root.view = $event.view">
</header-component>

<main-component view="root.view"></main-component>
app.component("mainComponent",  {
      template: "<p>{{$ctrl.count}}",
      bindings: {view: '<'},
      controller: function() {
        this.count = 0;
        this.$onChanges = function(changesObj) {
            if (changesObj.view) {
                this.count++;
                console.log(changesObj.view.currentValue);
                console.log(changesObj.view.previousValue);
                console.log(changes)bj.view.isFirstChanged());
            };
        };    
      }
});