RequireJS,Angular,在模块之间共享工厂

时间:2014-09-29 18:27:59

标签: javascript angularjs requirejs

我们正在使用requirejs和angular。现在我们尝试在不同的模块之间共享工厂,并且无法使工作正常。

如何在控制器/我们的应用程序中访问http服务?

我们的服务文件包括requirejs方式(小提取):

requirejs.config( {
    paths: {
        httpServices: 'apps/services/Http'
    }
} );

除此之外,我们还有我们的app javascript文件,我们注入了依赖项(httpService):

define( ['angularAMD', "httpServices", 'ngRoute', 'underscore'], function (angularAMD, httpServices) {
var app = angular.module( "clientapp", ['ngRoute'] );

var scripts = document.getElementsByTagName( "script" );
var myScript = _.find( scripts, function (s) {
    return s.src.substr( s.src.lastIndexOf( '/' ) + 1, s.src.length ) === 'index.js';
} );
var url = myScript.src.replace( "index.js", "" ) + "partials/";

app.config(function ($routeProvider) {
        $routeProvider
            .when( '/', {
                templateUrl: url + "dashboard.html"
            } )
            .when( '/basicdata/index/', {
                templateUrl: url + "basicdata/index.html"
            } )
    } );

return angularAMD.bootstrap( app );
} );

最后服务本身:

define( ['angular'], function (angular) {
'use strict';

/* Root herausfinden */
var root = window.location.pathname.split( "/" )[1];

var httpServices = angular.module( 'httpServices', [] );

httpServices.factory( 'sharedApplication', ['$rootScope', '$http', function ($rootScope, $http) {
    var sharedApp;
    sharedApp = {};
    sharedApp.currentView = "home-section";
    sharedApp.pastEvents = null;
    $http.get( "/" + root + "/api/search/md:ProductManager/" ).success( function (response) {
        return sharedApp.pastEvents = response.data;
    } );
    return sharedApp;
}] );

return httpServices;
} );

我们的问题是,我们根本无法获取/访问$ get-call的数据。我们总是得到一个对象,如下所示:

Object {_invokeQueue: Array[1], _runBlocks: Array[0], requires: Array[0], name: "httpServices", provider: function…}

我们认为我们的ajax调用的时间或我们使用该服务的方式有问题。

1 个答案:

答案 0 :(得分:0)

我们终于在今天早上设法解决了这个问题。这比预期容易。

首先需要改变的是:

sharedApp.pastEvents = null;

要:

sharedApp.pastEvents = {};

所以现在“pastEvents”变成了“指针”。

您还必须将工厂添加为角度模块中的依赖项。 这一行:

var app = angular.module( "clientapp", ['ngRoute'] );

需要改为:

var app = angular.module("clientapp", ['ngRoute', 'httpServices']);

使用更正的代码,您可以在控制器中使用工厂,如下所示:

app.controller('TestCtrl', function (sharedApplication)
{
    console.info(sharedApplication);
});

“sharedApplication”现在保存由“sharedApplication.pastEvents”中的ajax调用检索的数据。

编辑:

如果您不希望http.get立即执行,可以将其包装在如下函数中:

sharedApp.testFunction = function ()
    {
        $http.get("/" + root + "/api/search/md:ProductManager/")
           .then(function (response){
             sharedApp.data = response.data;
           });
    };

您的指针(sharedApplication.pastEvents)现在为空,直到您执行该函数(sharedApplication.testFunction();)。

祝你好运

蒂莫

相关问题