角度作为全局变量和参数之间的差异?

时间:2015-07-12 10:28:40

标签: javascript angularjs

我写了一个Angular工厂。对我来说有一个严重的错误。我徘徊修复它。最后,我清除了这个问题......没有理由。所以我需要清楚地描述下面的代码问题。

这是我的代码A:

    angular
    .module('BinD', ['ngSails'])
    .factory('UserService', function ($sails) {
        ...
    });

另一个B是:

(function (angular) {
    'use strict';

    angular
    .module('BinD', ['ngSails'])
    .factory('UserService', function ($sails) {
        ...
    });
})(angular);

错误部分是:

(function (angular) {
'use strict';

angular
    .module('BinD', ['ngSails'])
    .controller('SignUpCtrl', function ($scope, $window, UserService) {

代码B效果很好。代码一个错误消息“UserServiceProvider未知(可能?)”。我真的不知道为什么前面提到的两个相同的代码工作方式不同。让我知道。

2 个答案:

答案 0 :(得分:3)

在函数中包含。factory调用应该没有任何区别。我认为你必须做出不同的改变。

在您的第三个代码段中,当您使用两个参数调用.module时,您将创建一个新模块。这将覆盖您在“代码A”或“代码B”中创建的模块。

您没有重复使用相同的模块,而是创建一个新模块。因此,新模块上的UserService不存在是有道理的。

您的上一个代码段应仅使用一个参数调用.module('BinD')。只是您要使用的模块的名称。

angular
    .module('BinD')
    .controller('SignUpCtrl', function ($scope, $window, UserService) {

<小时/>

另一种选择是,您只需拨打.module一次,然后保存即可。

var app = angular.module('BinD', ['ngSails']);

之后您可以致电app.controllerapp.factory,而无需担心语法问题。

答案 1 :(得分:2)

在您的代码A 代码B 中,您创建了一个模块BinD,其依赖关系为ngSails,然后您就是使用该模块注册工厂,但代码A 将在全局范围内声明变量,如果您正在使用它并且代码B 将使用IIFE模式进行编码,这将使您的变量仅在声明的函数内可用。但这与你得到的错误无关。

在您的控制器中,您想要使用该工厂,但在创建controller时,您不应该像创建angular.module('BinD', ['ngSails'])那样创建新模块,这将刷新以前注册的工厂(或使用BinD模块的其他组件)将创建一个名为BinD的新模块。这就是为什么在控制器中注入UserService之后会抛出$injector错误,因为UserService在该模块中不可用。

<强>控制器

(function (angular) {
'use strict';

angular
    .module('BinD') //<- utilizing already created module
    .controller('SignUpCtrl', function ($scope, $window, UserService) {