Angularjs 角度可重用函数

Angularjs 角度可重用函数,angularjs,Angularjs,我有几个指令需要在完成它们的工作后调用相同的函数。此函数需要访问主控制器作用域,但也需要修改DOM。如何声明此函数以及在何处声明此函数?如果此函数需要访问控制器的作用域,我将使用指令中可访问的作用域,并将其作为参数传递,如下所示: var MyDirective = function() { var linkFn = function(scope, element, attrs) { callAwesomeFn(scope); }; return {

我有几个指令需要在完成它们的工作后调用相同的函数。此函数需要访问主控制器作用域,但也需要修改DOM。如何声明此函数以及在何处声明此函数?

如果此函数需要访问控制器的作用域,我将使用指令中可访问的作用域,并将其作为参数传递,如下所示:

var MyDirective = function() {
    var linkFn = function(scope, element, attrs) { 
        callAwesomeFn(scope);
    };

    return {
        link: linkFn
    }
};
现在,把它放在哪里

  • 如果这是一个实用程序函数,我会放入一些实用程序名称空间,比如
    MyFunctions.callAwesomeFn()
  • 如果这是一个需要与Angular管理的其他对象交互的组件,请使用依赖项注入并将其注入到指令中

您应该使用服务,服务可以访问
$rootScope
,尽管最好将DOM修改保持在指令级别,但在某些情况下您可以使用它

angular.module("myModule", [])
.factory("MyService", function ($rootScope) {
    return {
        myFunction: function () { // do stuff here }
    }
})
.directive("MyDirective", function (MyService) {
    return {
        link: function (scope, iElement, iAttrs) {
            // try do keep dom modification here, you have access to MyService,
            // let it do the algorithm and try to keep dom modification here.
            // PS: you can also inject $rootScope to directives.
        };
    };
});

感谢Lukasz,将作用域传递给实用函数正是我所做的事情,尽管在angular之外传递作用域以实现我的目标感觉有点脏。我的可重用函数调用另外两个函数;一个用于修改DOM,另一个用于调用控制器函数。我不确定您的第二个建议(DI)是否适合此目的?所有指令是否都在主控制器范围内?换句话说,是在定义主控制器的元素内实现这些指令的所有DOM元素(即
)?@bmleite-是的,对于解决方案和示例,它们是+1。很明显,我的可重用函数可以在服务中声明,然后可以传递给需要访问它们的指令。谢谢你!