声明angularjs控制器范围内的函数和属性,但未附加到$ scope

时间:2014-11-19 17:02:06

标签: javascript angularjs unit-testing angularjs-scope

截至最近,我一直在以下列方式为我的angularJS控制器声明函数和属性(app设置为主应用程序角度模块):

app.controller('myController', ['$scope', function($scope) {
    $scope.myProperty = "hello world";
    $scope.myFunc = function() {
        // do stuff
    };
}]);

过了一会儿控制器' $ scope增长到包含许多实用程序函数和属性,这些函数和属性未在我的视图中直接使用,并且不适用于其他控制器,因此我将其更改为:

app.controller('myController', ['$scope', function($scope) {
    var myProperty = 0, addOne;

    addOne = function(i) {
        return i++;
    };

    $scope.myFunc = function() {
        myProperty = addOne(myProperty);
        // do other stuff
    };
}]);

这工作正常但是可以按照上面显示的方式声明函数和属性,还是应该将它们提取到服务中?我可以从jasmine / karma中对我的控制器中的var声明函数进行单元测试(尝试但没有成功)?什么是最好的模式?

我已经开始使用'这个'用于完成上述相同操作的关键字,但我不认为增加的值会超过将所有内容转换为此模式所需的时间。如果这是完全错误的,请建议更好的策略。

---更新---

回答我自己关于在控制器中测试var声明函数的问题:How can we test non-scope angular controller methods?

2 个答案:

答案 0 :(得分:3)

作为一般规则,如果您不打算在视图中使用变量或函数,请不要将其附加到范围。因此,基于它的使用,在控制器或范围内声明您的变量和函数。你不想在$ scope上加入不必要的东西,因为这会减慢摘要周期。作为最佳实践,我在控制器中遵循以下格式:

app.controller('MainCtrl', function($scope) {

  // controller variables
  var age = 123;

  // scope variables
  $scope.name = 'John';

  // controller functions
  var helloWorld = function() {
    console.log('do work');
  }

  // scope functions
  $scope.isOld = function() {
    return age > 50;
  }

});

答案 1 :(得分:0)

服务是单身,而控制者则不是。 此外,服务用于在许多不同的控制器/指令之间共享功能。 您的第二个代码块看起来对我来说非常好,因为您不需要在应用程序的其他位置共享内部控制器特定功能,而且比将不需要的东西放在示波器中要好得多。