如何将指令中的数据输出到控制器,我应该这样做吗



用例

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


问题

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


代码

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


问题

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

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


替代方案

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

您的方法没有错。事实上,像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指令的任何指令上都可用。

相关内容

最新更新