从 AngularJS 中另一个文件中的控制器访问服务

Accessing a service from a controller in another file in AngularJS

我有一个使用 Onsen UI 和 AngularJS 构建的跨平台企业应用程序。

该应用程序发展迅速,因此我决定将我的主要 app.js 文件拆分成单独的文件。到目前为止,每个页面都有自己的控制器,所有控制器都在一个 app.js 文件中。

我还在我的 app.js 中定义了一个 service,我在其中存储用户名等值,以便在控制器。我需要在应用程序周期中存储这些,因为在所有页面上输入的所有值都会在用户交互结束时发送到服务器。

我已经成功地将控制器拆分到它们单独的文件中,但是我很难将服务移动到它自己的文件中,例如sharedProperties.js。

我的"new"app.js(简写)如下:

// Create the module that deals with the controllers
var app = angular.module("myApp", ['onsen', 'loginController', 'registerController']);

然后我在自己的文件中创建每个控制器,例如login.js如下:

// Get the main app.js module
var login = angular.module("loginController", []);
login.controller("LoginController", function($scope, $http)
{
    // Need to get and set values from/to sharedProperties here
});

然后在 index.html 中声明了不同的 .js 文件,所有这一切似乎工作正常。

我尝试在其自己的文件中创建服务 sharedProperties,例如sharedProperties.js 与下面的方式相同,但这不起作用。

// Get the main app.js module
var shared = angular.module("sharedProperties", []);
shared.service("SharedProperties", function()
{
    var username = "";   

    return {
        // Get and set the userName
        getUserName: function()
        {
            return userName;
        },
        setUserName: function(value)
        {
            userName = value;
        }
    }
});

我已经尝试将 sharedProperties 添加到我的模块中,但都没有成功。我已尝试将其添加到我的主应用程序中,如下所示:

// Create the module that deals with the controllers
var app = angular.module("myApp", ['onsen', 'sharedProperties', 'loginController', 'registerController']);

以及各个控制器的 function():

var login = angular.module("loginController", []);
login.controller("LoginController", function($scope, $http, sharedProperties)
{
    // Need to get and set values from/to sharedProperties here
});

但这些都不起作用。如何使新文件中的 sharedProperties 可供所有控制器使用?

此外,我该如何调用我的 getter 和 setter。当所有控制器和服务都在我原来的 app.js 文件中时,我会创建控制器,将 sharedProperties 添加到 function() 然后调用我的 getter 和 setter例如

app.controller("LoginController", function($scope, $http, sharedProperties)
{
    sharedProperties.setUserName(someValue);
    sharedProperties.getUserName();
});

或者有更好的方法吗?正如我提到的,我必须将 app.js 文件拆分成单独的文件,因为该应用程序变得越来越大并且越来越难以管理。由于我无法控制的原因,该应用程序会随着时间的推移变得更大。

您必须将模块 'sharedProperties' 注入到您要使用它的模块中。

通过这样做,它使模块知道 'sharedProperties' 中的所有内容。因此,您需要注入实际服务,而不是将 'sharedProperties' 注入控制器和其他服务。像这样:

    var app = angular.module("myApp", ['onsen', 'sharedProperties', 'loginController', 'registerController']);


    var login = angular.module("loginController", []);
    login.controller("LoginController", function($scope, $http, SharedProperties)
    {
    // Need to get and set values from/to sharedProperties here
    });

然后从那里调用您绑定到该服务的任何函数就像

SharedProperties.someFunction();
SharedProperties.someOtherFunction();

另注:推荐长手注射

login.controller("loginController", ['$scope','$http', 'SharedProperties', function($scope, $http, SharedProperties){
    //code in here
}]);

如果您打算缩小或丑化您的代码,这是适用的。