angularjs - 将方法作为字符串参数传递给指令不是一件坏事吗?

标签 angularjs angularjs-directive

在发现指令时,会遇到以下问题:

<div ng-app="twitterApp">
  <div ng-controller="AppCtrl">
    <div enter>Roll over to load more tweets</div>
  </div>
</div>

var app = angular.module('twitterApp', []);   
app.controller("AppCtrl", function ($scope) {
  $scope.loadMoreTweets = function () {
    alert("Loading tweets!");
  }
})

app.directive("enter", function () {
  return function (scope, element, attrs) {
    element.bind("mouseenter", function () {
      scope.loadMoreTweets();
    })
  }
})

他们说: “更好的做法是通过将 loadMoreTweets() 方法作为 View 中的字符串参数传递给指令,并从指令中的 attrs 参数中检索它来完全解耦 loadMoreTweets() 方法。”

所以它变成:

<div ng-app="twitterApp">
  <div ng-controller="AppCtrl">
     div enter="loadMoreTweets()">Roll over to load more tweets</div>
  </div>
</div>

app.directive("enter", function () {
  return function (scope, element, attrs) {
    element.bind("mouseenter", function () {
       scope.$apply(attrs.enter);
    })
  }
})

但这不会回到:

     **<div onClick="loadMoreTweets()">Roll over to load more tweets</div>**

这让我很困惑,JavaScript 再次与 HTML 混合在一起。我们不是在努力避免这种情况吗?我们现在使用 addEventListener() 和 AttachEvent() 还是我认为这是错误的。

最佳答案

这是我的两分钱。

这并不是说我们一定要从 HTML 中删除所有脚本调用,而是我们不想依赖 HTML 来让脚本工作。这样 HTML 就可以被替换,并且我们知道管道(在本例中为 AngularJS)仍然可以工作。您不想从墙的 Angular 引用任何需要 DOM 知识(除了指令)的东西( Controller 、服务)。

它清楚地分离了您的业务逻辑(然后可以进行测试)和您的 View (这几乎需要人工测试......直到人工智能变得更好)。

在某些情况下,例如单击事件, View 不可避免地需要了解底层脚本,如果一个使用另一个,它们就会连接起来。好处是在 Angular 方面,您只需要保持接口(interface)相同,并且可以更改实际的实现,而不会弄乱 View (它始终与接口(interface)有关并能够替换依赖项)。

基本上编写此指令,以便它使用参数来潜在地扩展其功能以调用任意函数,而不是将其绑定(bind)到仅执行一项特定任务,将避免重复和调整此代码的需要(不要重复自己,DRY) .

无论长短,解耦都很重要,但对相互协作的部分之间的接口(interface)有一些了解始终是必要的。有时,避免代码重复(因此,如果出现问题/调整,需要更新很多地方)的优势超过了将底层结构的任何知识隐藏在 View 之外的愿望。

请记住,addEventListener/attachEvent 仍然在这里发生,请参阅 element.bind 调用,这仍然允许多个事件处理程序。

关于angularjs - 将方法作为字符串参数传递给指令不是一件坏事吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17582444/

相关文章:

javascript - 在 Angular.js 中扩展 $scope

javascript - 在指令中获取子属性

javascript - UI Router - 状态转换延迟(非常慢)

angularjs - 将数据传递给 AngularJS 中的自定义指令

javascript - 如何在隔离范围内创建嵌套对象

AngularJS : use local storage

javascript - 如何将 $http 获取响应存储在可从外部 $http 函数(Angularjs)访问的变量中?

javascript - 将回调函数传递给指令

javascript - Onsen UI PostPush 事件回调触发多次

javascript - 希伯来语不显示 $http.get