在angularjs中使用控制器的功能

时间:2015-09-03 05:44:27

标签: javascript angularjs

我正在使用像这样的控制器

.controller("somename",function($scope,$http){
//some get function to fetch data
$scope.data = dataReturned;
$scope.$apply();
});

工作正常。然后我想在阅读johnpapa's blog之后使用函数并将其更改为下面的函数

.controller("somename",someNameController);
function someNameController(){
var someName = this;
//some get function to fetch data
    this.data = dataReturned;
    this.$apply();
};

但这不起作用,因为this.$apply不是函数

当我添加$ scope(不推荐)时,它开始工作

 .controller("somename",someNameController);
    function someNameController($scope){
    var someName = this;
    //some get function to fetch data
        $scope.data = dataReturned;
        $scope.$apply();
    };

是否可以消除$scopefunction someNameController($scope)的传递?

3 个答案:

答案 0 :(得分:2)

为什么要跳过$ scope?为了获得控制器中所有方法和变量的引用,你必须使用$ scope .thanks

答案 1 :(得分:1)

在缩小过程中,最简单的方法是将控制器作为函数处理并注入依赖项,而不会破坏任何内容。

(function(){

    'use strict';

    var MainCtrl = function($scope){

       // Do something

    };

    MainCtrl.$inject = [
        '$scope'
    ];

    app.controller('MainCtrl', MainCtrl);

})();

答案 2 :(得分:1)

您正在关注John Papa的风格指南,并使用所谓的 controller-as 语法。

controller-as 语法允许在视图中使用函数实例,因此没有必要注入$scope以使数据可用于视图。一个简单的this.data = mydata就足够了。

但是,当使用$scope中提供的特殊功能时,$scope仍然必须注入控制器功能。 $apply()$watch()等通常是其中的一部分。 This article正好解释了这一点。

关于控制器作为John Papa的风格指南(强调我的)的语法:

  

有助于避免在控制器中使用$scope方法的诱惑   当它可能更好地避免它们或将方法移动到   工厂,并从控制器引用它们。 考虑使用$scope   仅在需要时在控制器中。例如,发布时和   使用$emit$broadcast$on订阅活动时请考虑移动   这些用于工厂并从控制器调用。

简短的回答是 - 如果没有注入$scope或其他具有$scope的服务作为依赖关系,则无法使用$scope方法