Javascript 在Angular中,声明要在模板中使用的全局函数的最佳方法是什么?

Javascript 在Angular中,声明要在模板中使用的全局函数的最佳方法是什么?,javascript,angularjs,global-variables,Javascript,Angularjs,Global Variables,在模板中使用函数有两种方法(或者有其他方法?): 1。在$rootScope中声明它: app.run(function ($rootScope) { $rootScope.makeURL = function (url) { return 'http://mysite.ru/' + url; } }); app.directive('makeURL', function () { return { link: function ($scope, $elemen

在模板中使用函数有两种方法(或者有其他方法?):

1。在$rootScope中声明它:

app.run(function ($rootScope) {
  $rootScope.makeURL = function (url) { 
    return 'http://mysite.ru/' + url;
  }
});
app.directive('makeURL', function () {
  return {
     link: function ($scope, $element, $attrs) {
        var url = 'http://mysite.ru/' + $attrs.makeurl; // just example

        $element.attr('href', url);
     }
  }
} 
在模板中:

<a href="makeURL('blog')">go Blog</a>
<div ng-controller="SomeCtrl">
  <a makeURL="blog">go Blog</a>
</div>
在模板中:

<a href="makeURL('blog')">go Blog</a>
<div ng-controller="SomeCtrl">
  <a makeURL="blog">go Blog</a>
</div>

使用服务

mymodule.service('URL',function(){
 this.make=function(){...}
});

mymodule.controller($scope,URL){
$scope.URL=URL;
}

<a href="{{Url.make(somedata)}}"/>
mymodule.service('URL',function()){
this.make=函数(){…}
});
mymodule.controller($scope,URL){
$scope.URL=URL;
}

服务将使您的控制器更易于测试,并且您将能够单独测试服务。如果在angular.run方法中向rootscope添加任何内容,则会更加困难。

我会选择filter,因为它是您正在进行的一种转换。您能否给出更具体的情况,而不是“仅举一个例子”?在这里,指令显然是一种方法(但使用模板,而不是使用
$attr
!),但这可能不是您真正想问的问题,对吗?主要问题是“如果我们可以将$rootScope用于全局变量,它很酷,但许多ppl说它很糟糕,我不理解为什么”。如果它不好,我需要选择什么样的方式)好的,关于例子。我使用的是一个提供程序,它生成为项目中所有URL生成路径的服务,所以现在我使用它作为
app.run(函数($rootScope,getRoute){$rootScope.getRoute=getRoute;})好,但如果我需要全局函数,这意味着我需要在需要的每个作用域中使用它?呵呵。。请解释一下为什么我需要在$rootScope中使用service来代替glob declare?你可以有一个全局控制器。因为你不想在rootScope上附加任何东西(除了事件)。这是“坏”的做法。“坏”的做法-答案也是一样——“什么都没有”。Sry ofc,但想知道更多。。我能理解使用$rootScope作为全局函数是否需要更多内存或smth其他。。但不是“坏习惯”。我认为PS global controller是个好主意。使用rootscope会降低控制器的可测试性。如果需要在测试控制器之前执行run,则无法单独测试控制器。使用服务,您不需要做任何事情来测试控制器,这就是为什么。如果您关心可测试性,则不会向rootscope添加任何内容。