AngularJS:为什么不在 Controller 中编写逻辑?

标签 angularjs angularjs-directive standards angularjs-controller

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

直到现在我还没有真正理解为什么会出现这种情况。编写指令不会带来很多开销吗?我在 Controller 中编写逻辑时没有遇到任何问题,这很简单。 这种方法有哪些缺点?

最佳答案

Controller 是执行与范围相关的所有操作的正确位置。这是你写所有内容的地方

$scope.$watch(...)

并定义您需要从 View 访问的所有$scope函数(例如事件处理程序)。一般来说,事件处理程序是一个计划函数,它将依次调用函数服务。

$scope.onLoginButtonClick = function(){
    AuthenticationService.login($scope.username,
        $scope.password);
};

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

不要:在 Controller 中编写业务逻辑

前面的示例之所以如此,有一个非常具体的原因。它向您展示了一个 $scope 函数,该函数依次调用服务中的函数。 Controller 不负责登录机制或登录如何发生。如果您在服务中编写此代码,则将服务与 Controller 解耦,这意味着您想要在其他任何地方使用相同的服务,您所需要做的就是注入(inject)并触发该函数。

future Controller 的规则:

  • Controller 应保持零逻辑 Controller 应该仅绑定(bind)对模型的引用(并调用从 Promise 返回的方法)
  • Controller 仅将逻辑组合在一起
  • Controller 驱动模型更改和 View 更改。关键词;驱动,而不是创建/持久,它触发它们!
  • 委托(delegate)更新工厂内部的逻辑,不解析 Controller 内部的数据,仅使用更新的工厂逻辑更新 Controller 的值,这避免了跨 Controller 的重复代码,并使工厂测试变得更加容易
  • 让事情变得简单,我更喜欢 XXXXCtrl 和 XXXXFactory,我确切地知道两者的作用,我们不需要花哨的名称
  • 在共享方法中保持方法/属性名称一致,例如 this.something = MyFactory.something;否则会变得困惑
  • 工厂保存模型,更改、获取、更新和保留模型更改
  • 将工厂视为需要持久化的对象,而不是持久化在 Controller 内
  • 与工厂内的其他工厂交谈,让他们远离 Controller (例如成功/错误处理)
  • 尽量避免将 $scope 注入(inject)到 Controller 中,通常有更好的方法来完成您需要的操作,例如避免 $scope.$watch()

关于AngularJS:为什么不在 Controller 中编写逻辑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31454488/

相关文章:

javascript - 在 AngularJS 中切换自定义排序图标

css - Angular Material 缺少 CSS 类

javascript - Angular JS 以树状格式呈现 JSON

javascript - 指令内的范围变量未显示值

c - C 中的 void 类型

一个符合标准的 C 实现#define NULL 可以是古怪的东西吗

javascript - 如何在 ui-router 中使用单独的模板?

javascript - 寻找 AngularJS 轮播

javascript - 无法让动态模板在 Angular 指令中工作

c++ - 如何测试在 Visual Studio 2010 中开发和管理的 C++ 代码库的可移植性?