1

我是 angularJS 的新手。

当我在 angularJS 指令中声明 var 或函数时,aFunction() 和 aVar 属于什么命名空间?

以这种方式声明它们是否正确,或者我应该在它们前面加上 $scope 之类的前缀?

这是一个代码片段:

define(['aName'], function () {'use strict';       
   angular.module('aName').directive('aName', ['$compile', 'serviceName',  
     '$parse', '$window', '$document', function ($compile, serviceName, $parse, 
        myWindow, $document) { return {

           ...

           function aFunction() { ... } //or should it be $scope.aFunction?

           var aVar = function anotherFunction() { ... } //or should it be $scope.aVar?

           ...

        };
   }]);
});
4

1 回答 1

1

angularjs 中的命名空间并不是最强大的部分。事情最终会转到一个名为angular. 那里定义了几个可用于创建对象的函数,例如module. 这对于服务名称(我们依赖使用服务名称的依赖注入)或全局函数控制器特别有问题。模块是一组逻辑组,例如指令或控制器,但(不太确定)它不是隔离组件的方法。尝试在两个模块中使用同名指令。在教程中,他们将控制器定义为全局函数:

function MainCtrl() {...}

而不是使用模块,至少不会污染全局命名空间。

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

angular.directive() 返回一个 DDO(指令定义对象),例如:

app.directive('person', function () {
return {
    restrict: 'E',
    replace: true,
    template: '<div class="person">Person name: {{ name }}</div>',
    scope: {
        name: '@'
    }
};
});

您应该使用一组有限的属性(restrict、replace、template、templateUrl...)。

function aFunction() { ... }那里没有多大意义。它甚至不是key:value。如果它是一个在指令中封装一些逻辑但不必暴露给视图的函数,则可以如下所示:

app.directive('person', function () {
var f = function() {...};
return {
    restrict: 'E',
    replace: true,
    template: '<div class="person">Person name: {{ name }}</div>',
    link: function(...) { 
        /* and it becomes available */
        f()
     }
};
});

如果您不使用var,它会尝试按照 javascript 范围规则将其解析为全局对象。

您的第二个示例var aVar = function anotherFunction() { ... }是仅在当前 [javascript] 范围内可用的函数,即在您拥有的任何函数中。例如:

link: function(...) { 
   /* and it becomes available */
   f();
   var g = function () {...};
   g(); // only works in the scope of link();
}

如果您想要将此功能公开给视图,那么<div ng-click="fireFn()">您可能应该将它放在范围内。在范围内定义此函数的好地方是控制器或链接函数:在控制器中,

app.controller('MainCtrl', function ($scope) {
    $scope.name = 'World';
    $scope.fireFn = function() {...}; // scope is the injected service. use the $
});

在链接器中:

link: function(scope) { 
   /* and it becomes available */
   f();
   var g = function () {...};
   g(); // only works in the javascript scope (not the parameter!) of link();
   scope.fireFn = function() {...}; // scope is the first parameter
}

至于隔离模块,将它们放在闭包中不会造成任何伤害:

(function () {
    "use strict";
    var mymodule = angular.module('mymodule', []);
}());
于 2013-07-05T09:39:41.423 回答