Javascript 如何避免在controller';什么范围?

Javascript 如何避免在controller';什么范围?,javascript,angularjs,Javascript,Angularjs,使用angularJS 1.3,在下面的代码中 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.20/

使用angularJS 1.3,在下面的代码中

<!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8">
            <title></title>
            <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.20/angular.js"></script>
            <script type="text/javascript">
                var app = angular.module("sample", []);
                app.controller("emp", function(){
                        this.Name = "jag";
                        this.sal = "4500";
                        this.getAnnualSal = function(){
                            return (this.sal) * 12;
                        }
                    });
            </script>
        </head>
        <body ng-app="sample">
            <div ng-controller="emp as o">
                Hello {{o.Name}}, your annual salary is {{o.getAnnualSal()}}

            </div>
        </body>
    </html>

var app=angular.module(“示例”,[]);
应用控制器(“emp”,功能(){
this.Name=“jag”;
这是sal=“4500”;
this.getAnnualSal=函数(){
报税表(本表)*12;
}
});
你好{{o.Name},你的年薪是{{o.getAnnualSal()}
将函数(
getAnnualSal
)保留为控制器实例成员看起来很奇怪。 因为,
emp
的每个控制器实例都有自己的
getAnnualal

emp
控制器实例范围如下所示:


将函数(
getAnnualSal
)作为原型成员进行维护有意义吗?如果是,请提供语法。

您可以选择将控制器声明为单独的类。AngularJS没有为此提供特殊语法,因此您可以

function MyController() {
    this.Name = "jag";
    this.sal = "4500";
} 
MyController.prototype.getAnnualSal = function(){
    return (this.sal) * 12;
}
var app = angular.module("sample", []);
app.controller("emp", MyController);
如果要使用自定义注入(例如,
$scope
$rootScope
,…),可以:

function MyController($scope) { ... all the former code ... }
...
var app = angular.module("sample", []);
app.controller("emp", ['$scope', MyController]);

有关注射的疑问,请参考官方教程或文档(例如,
$provide
)。唯一的区别是使用匿名函数或命名函数(其行为始终与构造函数相同)。

您可能希望实际使用指令而不是唯一的控制器。如果你仔细想想

  • 如果控制器作用域需要dom操作,您会怎么做
  • 如果您需要如您所述的此控制器的多个实例,该怎么办
  • 那么你需要一个html模板吗
  • 一般来说,您应该做的一件事是将其分配给作用域顶部的var,以便以后可以引用

    app.controller("emp", function(){
                            var vm = this;
                            this.Name = "jag";
                            this.sal = "4500";
                            this.getAnnualSal = function(){
                                return (vm.sal) * 12;
                            }
                        });
    

    很少为控制器声明类。所以不要担心原型。特别是当一次只存在一个实例时。但是是的,你可以自由地去做。@LuisMasuelli我想要它的语法来写答案…浏览器可以循环使用相同的函数,因此,原型可能不会像预期的那样节省…但是
    MyController
    是在1.3版之前的angularjsI中使用的全局控制器,只是稍微更改了您提供的语法。我显式地将对控制器类的引用传递给.controller调用。它不是全局的,因为全局意味着强制angular在
    窗口中查看引用,我没有这样做,而是直接传递引用。在第二种方法中,我们是否需要传递
    $scope
    函数
    getAnnualSal
    ?我的意思是
    MyController.prototype.getAnnualSal=function($scope){..}
    不,你没有。不,你不应该。特别是如果该函数将在模板中使用:没有任何名称的
    $scope
    对象可用。