控制器可以完全被指令中的链接功能取代吗?

时间:2015-01-14 17:56:28

标签: angularjs angularjs-directive

我正在阅读这篇文章:

http://teropa.info/blog/2014/10/24/how-ive-improved-my-angular-apps-by-banning-ng-controller.html

建议将控制器集成到这样的指令中,以消除使用ng-controller的需要:

angular.module('contestantEditor', [])
  .directive('cContestantEditorForm', function() {
    return {
      scope: {
        contestants: '='
      },
      templateUrl: 'contestant_editor.html',
      replace: true,
      controller: 'ContestantEditorFormCtrl',
      controllerAs: 'ctrl',
      bindToController: true
    };
  })
  .controller('ContestantEditorFormCtrl', function($scope) {

    this.contestant = {};

    this.save = function() {
      this.contestants.push(this.contestant);
      this.contestant = {};
    };

  });

然而,在评论中,其他人提出了这个解决方案:

angular.module('contestantEditor', [])
  .directive('cContestantEditorForm', function () {
    return {
      scope: {
        contestants: '='
      },
      templateUrl: 'contestant_editor.html',
      replace: true,
      link: function (scope) {
        scope.contestant = {};

        scope.save = function() {
          scope.contestants.push(scope.contestant);
          scope.contestant = {};
        };
      }
    };
  });

它与控制器版本完全相同,无需制作控制器。因此,我很好奇这两种方法的优缺点与传统上用ng-controller写角度有什么关系,以及控制器在结束时是否是必要的。

Here是第一个的掠夺者,here是第二个。

2 个答案:

答案 0 :(得分:4)

指令中,您应该尽可能使用链接功能。仅在需要与其他指令进行通信时才使用控制器

您可以找到有关此讨论的更多信息here。特别是这个最佳实践声明:

  当您想要将API公开给其他指令时,

最佳实践使用控制器。否则,请使用链接

答案 1 :(得分:-1)

指令和控制器是两个完全不同的东西。

指令应该用于DOM操作。

如果你想知道在DDO中使用控制器或者为你的逻辑使用链接功能,那么当你想要提供API并在其他指令中需要你的指令并在其他指令中使用该API时,你应该在DDO中使用控制器扩展指令


控制器不能被指令

取代

控制器应该包含您的业务逻辑,它不能被指令替换,不应该有DOM操作。