2015-07-12 75 views
5

我写了一个Angular的工厂。对我来说有一个严重的错误。我徘徊着去修复它。最后,我清除了这个问题......没有理由。所以我需要清楚地描述下面的代码问题。作为全局变量和参数的角度差异?

这里是我的代码:

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未知(可能?)”。我真的不知道为什么前面提到的两个相同的代码有不同的作用。让我知道它。

回答

3

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

在您的第三个代码段中,当您使用两个参数调用.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,而不必担心语法。

+0

啊哈,所以我声明不同的模块'BinD'和模块必须被管理一个外部变量。是吗? –

+0

你的第二种方法将永远不会在他的情况下工作..在第二部分中,他正在使用IIFE模式。 –

+0

@ user3413534如果您发现更容易,您可以在外部变量中对其进行管理。这通常是我所做的。 –

2

在你代码A代码B在你创造了一个模块BinDngSails的依赖,然后要注册工厂,该模块既一部分,但代码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) {