在Angularjs中,模态应该是服务还是指令?

时间:2015-04-27 21:16:33

标签: angularjs

所以我一直在阅读指令,服务和控制器。我觉得我很清楚什么在哪里。例如,dom操作在指令中发生,api调用在服务中发生。然后我需要制作一个模态。我的第一个想法是这是一个指令,然后我看了Angular UI,他们将它设置为服务。我很惊讶地看到它是一项服务。这是正确的方法,还是这种考虑和反模式?我读到Angular UI是学习时的好地方,但我不确定?模态比我预期的更令人困惑。

2 个答案:

答案 0 :(得分:3)

Angular中的一般规则是DOM操作应仅在指令内部进行,并且大多数情况下该规则适用。但是在某些情况下,声明式方法并没有感觉正确,至少可以说,因为这些情况本质上是必要的。模态和自定义警报就是两个例子,仅举几例。

为了举例说明我所说的话,请看一下前一段时间我回答的a similar question这个例子:

势在必行的方法

clean()

回到当天,AngularUI的app.controller('Ctrl', function($scope, $dialog) { $scope.doSomething = function() { $dialog.dialog().open().then(function(result) { if (result === 'OK') { // Process OK } else { // Process anything else } }); } }); 被称为$modal

陈述性方法

$dialog

第二种方法很难写,它打破了代码的流程。这就像试图将方形钉钉入圆孔一样。

IMO DOM操作只发生在指令语句中更像是一个(非常)强烈推荐而不是硬规则。它存在于人们 - 特别是Angular的新手 - 避免从服务和控制器中访问DOM。

答案 1 :(得分:0)

当我需要重构代码时,我有完全相同的问题,允许在应用程序中使用更多对话框。我们目前正在使用Angularjs 1.6。

我发现您可以将指令放入每个模板中,然后使用ng-show和ng-hide显示/隐藏模态。然而,虽然使用DOM操作的指令是Angularjs中的一种约定,如前所述,在这个用例中,模态窗口的指令在控制器和模态指令之间创建紧密耦合。

在此用例中使用服务是可接受的偏差,因为通过使用服务将模式注入DOM,它是根据需要而不是总是在页面上的模态指令完成的,这使得这种方法更具动态性减少与模板的耦合。

作为另一个验证,我发现Angular UI团队使用相同的方法和模态服务:$uibModal来创建模态窗口。