如何在不使用$ watch,$ broadcast,$ emit等的情况下触发服务中的控制器更改

时间:2019-08-29 10:34:49

标签: angularjs

我有一堆按层次排列的组件,即:

    与合作伙伴组织合作的
  • 合作伙伴组件,知道如何更新或删除它们,等等;

  • 与领导者组织合作的
  • 领导者组件,知道如何与领导者组织打交道;

  • 列表组件,然后向用户显示合作伙伴和领导者组织;

  • 服务-当合作伙伴或领导者组件删除组织时,该组织的信息将传递到列表组件,以便这些更改立即反映在最前面。

我不能为此提供代码示例,因为它太大了,而且我的问题主要需要概念性的建议,而不是代码问题。 现在,它可以正常工作-组件正在完成将数据发送到服务的工作:

  IndexCollection.setIndexes(
       vm.leaderIndex, vm.partnerIndex, 'added_l', response.id
  );

服务完成其工作,并将更改推送到变量,我在列表组件中$watch触发了相应的操作,例如:

   $scope.$watch(() => IndexCollection.indexes, function() {
            let indexes = IndexCollection.indexes;

            switch (indexes.message) {
                case 'deleted_p':
                    removePartner(indexes);
                    break;
                case 'deleted_l':
                    removeLeader(indexes);
                    break;
                case 'added_l':
                    addLeader(indexes);
                    break;
            }
        });

我的问题更具理论意义。是否有可能在不使用$watch, $emit, $broadcast和我们通常在这方面使用的其他标准工具的情况下,通过列表组件中的服务触发实时操作?

我可以通过使用回调以某种方式获得相同的结果吗?我的意思是,当服务发生变化时,它会触发相应控制器中的立即采取行动吗?

1 个答案:

答案 0 :(得分:0)

虽然使用$ watch可以解决问题,但这不是最有效的解决方案。 您可能想要更改更新和检索服务数据的方式。

组件控制器应基于组件触发的操作/事件,使用服务中的功能来操作存储在服务中的数据,然后将服务注入组件中。

MyDataService.getIndexCollection() {}
MyDataService.putIndexCollection() {}

然后,通过组件的require或绑定或指令的隔离作用域将数据传递给所有指令和组件。

例如,一旦合作伙伴组件编辑了服务上的数据,您将再次从服务中获取数据,并且更新后的数据将被传递到列表组件,并在需要时通过$ apply()更新视图。