如何将数据从指令输出到控制器,我应该吗?

时间:2013-11-20 23:03:53

标签: angularjs angularjs-directive

用例

为了在表单中使用,我创建了一个跟踪数组中更改的指令。它允许还原更改,并且可以单独存储删除和添加。它允许以递增方式更新数组(数据库中的一对多映射)(而不是要求服务器进行diff或重写整个列表)。


问题?

我的问题是关于我将功能暴露给控制器范围的方式。我目前在指令的范围上使用双向数据绑定属性。这很有效,而且看起来很可靠(当然你可以通过重新分配范围的值来轻松破解它,但有意识地你可以破坏任何东西)。


代码

您可以看到此 plunk 以查看此操作。它允许从视图和视图的控制器调用指令控制器上的方法。 (我故意使用指令控制器,因为这是我在指令通信指令的实际代码中所做的,但这也可以放在链接函数中。)


问题

这样做不好设计吗?我现在完全把AngularJS扔出窗外并乱砍我自己的代码。有没有更好的方法来公开指令中的函数(请记住,在单个表单中会有多个这样的函数)。

传递my-attribute="someFunction()"以使指令成为视图控制器的使用者非常容易。我找不到更好的方法来做相反的事情并让视图控制器从指令中消耗。


替代?

我一直在考虑在这里使用服务,其中服务将提供一个在视图中实例化的对象,传递给指令,并使指令模糊它的结果到该对象。然后又让视图控制器使用该服务对象的信息。这会是一种更好的方法吗?

1 个答案:

答案 0 :(得分:1)

你的方法没有错。事实上,内置的角度指令(如ng-form)使用此方法将控制器存储在范围内(请参阅ng-form的name属性)http://docs.angularjs.org/api/ng.directive:ngForm

为了获得更多的可重用性,我将api方法放在控制器上,然后将控制器本身放在api中:

this.getChanges = function () {};
this.resetChanges = function(){};

$scope.api = this;

在指令中,控制器的主要目的是作为其他指令的api(如果你不需要api用于其他指令,你可以在链接函数中完成所有操作)。这样做可以确保api既可用于范围,也可用于任何“需要”oneToMany指令的指令。