【问题标题】:Is it bad practice for an angular directive to request data角度指令请求数据是不好的做法吗
【发布时间】:2015-10-19 08:55:25
【问题描述】:
以 currentUser 指令为例。
我可以让控制器使用服务来获取有关当前用户的数据,将其提供给指令并让指令呈现一些“hello {user.name}”模板。
或者,我可以让指令依赖于某些 currentUserService,并在指令的控制器中请求 currentUserService.getCurrentUser。
出于某种原因,两者中的一个明显优于另一个吗?
我倾向于使用第一个选项,但不确定使用第二个选项是否不会有利于减少所有当前用户逻辑的分布......
谢谢
【问题讨论】:
标签:
angularjs
angularjs-directive
separation-of-concerns
【解决方案1】:
只要您从服务请求数据,我相信在指令中对它有依赖就可以了。
控制器的主要方面是可以访问 $scope,仅此而已。
【解决方案2】:
有两种情况,这实际上取决于您的指令的目的:
- 该指令仅用于显示用户数据(以复杂的方式)
- 该指令显示数据并对其进行操作(根据用户输入)
场景 1
由于指令的唯一目的是以某种方式呈现数据,因此该指令不应负责检索数据。
因此,您将如何访问数据和如何显示数据的逻辑解耦。这样,您还可以将指令用于当前登录用户以外的用户。
如果应该有一些特殊的东西可见,如果用户已经登录,指令应该使用 ng-if 或 ng-show (并且可能是禁用该视图部分的参数)。
场景 2
在这种情况下,指令的目的是为某些业务逻辑提供 gui(服务功能)。因此服务应该被注入到指令中。
备注:
性能
如果您通过服务中的方法调用获取数据,如果您加载数据并将其注入指令控制器,则此方法在每个摘要循环中只会被调用一次。否则,每次出现指令时,它可能会被调用一次。
诚信
请记住,如果您的服务方法通过 http 请求数据并且您在视图中使用该指令例如 3 次并且该指令调用服务方法本身,这将导致 3 个相同的请求,这些请求可能具有非相同的结果(即其他人在处理请求时更改了数据)。
【解决方案3】:
使用服务驻留业务逻辑总是更好。您应该使用服务获取数据并将该服务注入指令。不要使用控制器在指令之间进行通信。服务就是为此目的,启动一次。