AngularJS:为什么不在控制器中编写逻辑?

Tar*_*gar 8 standards angularjs angularjs-directive angularjs-controller

请原谅我,如果这听起来很愚蠢,但我现在已经使用AngularJS一段时间了,我看到有人告诉我将我的逻辑包装在一个指令(或服务?)而不是我的控制器中,只保留我控制器中的绑定.除了指令的可重用性方面还有其他原因吗?

到目前为止,我还没有真正理解为什么会这样.不写指令会带来很多开销吗?我没有遇到任何在我的控制器中编写逻辑的问题,而且很容易.这种方法的缺点是什么?

ngL*_*ver 13

控制器是完成所有操作以及与范围相关的所有操作的正确位置.这是你写所有的地方

$scope.$watch(...)
Run Code Online (Sandbox Code Playgroud)

并定义$scope您需要从视图中访问的所有函数(如事件处理程序).通常,事件处理程序是计划函数,它又将函数称为服务.

$scope.onLoginButtonClick = function(){
    AuthenticationService.login($scope.username,
        $scope.password);
};
Run Code Online (Sandbox Code Playgroud)

在极少数情况下,您可以在其中添加promise成功处理程序.

DONT:在控制器中编写业务逻辑

有一个非常具体的原因,为什么早期的例子是这样的.它向您展示了一个$scope函数,该函数又在服务中调用函数.控制器不对登录机制或登录方式负责.如果您在服务中编写此代码,则将服务与控制器分离,这意味着您希望使用相同服务的任何其他地方,您需要做的就是注入并取消该功能.

未来财务主任的规则:

  • 控制器应保持零逻辑控制器应仅绑定对模型的引用(以及从promises返回的调用方法)
  • 控制器只将逻辑结合在一起
  • 控制器驱动模型更改和查看更改.关键词; 驱动器,而不是创建/持久,它触发它们!
  • 委托更新工厂内部的逻辑,不解析Controller内的数据,只更新Controller的值与更新的Factory逻辑,这避免了跨控制器的重复代码以及工厂测试变得更容易
  • 保持简单,我更喜欢XXXXCtrl和XXXXFactory,我确切知道这两个人做了什么,我们不需要花哨的名字来做事情
  • 保持方法/道具名称在共享方法中保持一致,例如this.something = MyFactory.something; 否则会变得混乱
  • 工厂持有模型,更改,获取,更新和持久化模型更改
  • 将Factory视为一个需要持久存在的对象,而不是在Controller中持久化
  • 与工厂内的其他工厂交谈,让他们远离控制器(成功/错误处理之类的事情)
  • 尽量避免向控制器注入$ scope,通常有更好的方法来做你需要的事情,比如避免$ scope.$ watch()