是否应该在$ scope上声明每个函数?

时间:2014-07-17 18:58:36

标签: angularjs angularjs-scope

我想知道在$scope对象上声明函数的最佳实践是什么。如果我有一个未在HTML页面上使用的功能,应该在$scope上声明吗?

例如:

$scope.pageModel = { variables }

$scope.pageModel.btnSearchOnClick = function() {
       // some action
}

function randomFunction() {
       // some more actions
}

HTML中使用btnSearchOnClick()函数,例如:

<button name = "btnSearch" ng-click = "pageModel.btnSearchOnClick" ... >

然而,在使用此控制器的HTML中可能永远不需要randomFunction()函数,所以可以像我上面那样声明它吗?或者控制器内的每个功能是否应附加到$scope

1 个答案:

答案 0 :(得分:1)

如果你问我,你设置它的方式比在$ scope上公开所有内容更好。

我不确定对这个主题或“最佳实践”有一个普遍的共识,所以我会选择你拥有的东西。

不需要从$ scope或视图调用的函数通常可以按照您的方式进行定义。

我还想做的是,如果一个函数变得非常沉重,暴露在$ scope范围内 - 将它分成更小的,更多的点函数来执行单独的任务。

不将这些函数暴露在$ scope上的缺点是缺乏可测试性(可以说你不关心单元测试中的内部实现)。解决这个问题的方法是在Controller本身上定义它们。就这样:

app.controller('someCtrl', function ($scope) {
  var ctrl = this;

  $scope.exposed = function () {
    ctrl.internal();
  });

  ctrl.internal = function () {
    console.log('Internal function called from $scope');
  });
});

这样,在你的单元测试中 - 你可以做这样的事情(记住这只是一个粗略的例子):

describe('someCtrl', function () {
  var Subject, $scope;

  beforeEach(function () {
    // setup...

    inject(function ($rootScope, $controller) {
      $scope = $rootScope.$new();

      Subject = $controller('someCtrl', {
        $scope: $scope
      });
    });
  });


  context('$scope', function () {
    it('has an exposed function', function () {
      expect($scope).to.have.property('exposed').and.to.be.a('function');
    });
  });

  context('internals', function () {
    it('has an internal function', function () {
      expect(Subject).to.have.property('internal').and.to.be.a('function');
    });
  });

});