我们正在使用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调用的时间或我们使用该服务的方式有问题。
答案 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();)。
祝你好运
蒂莫