Javascript 角度服务问题
我需要一些帮助来理解以下角度服务代码中的错误 编辑: 我在不同的js文件中有几个控制器使用CRUDAPI,比如Javascript 角度服务问题,javascript,angularjs,angularjs-service,Javascript,Angularjs,Angularjs Service,我需要一些帮助来理解以下角度服务代码中的错误 编辑: 我在不同的js文件中有几个控制器使用CRUDAPI,比如 $http.get('/api/sites/' + service.siteID) 或者只需要像指令一样的变量 templateUrl: '../../' + service.template + ' + '.html' 所以我创建了一个服务来在所有js文件之间共享这些变量,而不是在每个文件中进行api调用 这是服务 app.service('SharedData', functi
$http.get('/api/sites/' + service.siteID)
或者只需要像指令一样的变量
templateUrl: '../../' + service.template + ' + '.html'
所以我创建了一个服务来在所有js文件之间共享这些变量,而不是在每个文件中进行api调用
这是服务
app.service('SharedData', function($http) {
$http.get('config.json')
.success (function(data) {
var siteID = data._id;
console.log(siteID); // return 553e2d15f91e4bd75d000008
$http.get('/api/sites/' + siteID)
.success(function(site) {
var template = site.template;
console.log(template); // return myTemplate
})
.error(function(data) {
console.log('Error: ' + data);
})
})
.error(function(data) {
console.log('Error: ' + data);
})
service = {
siteID : siteID, // return undefined instead of 553e2d15f91e4bd75d000008
template : template // return undefined instead of myTemplate
};
return service;
})
我只想精确一点。如果我像下面这样编写我的服务,它工作得很好,我的意思是在所有控制器和指令中都能很好地传递值
app.service('SharedData', function() {
service = {
siteID : '553e2d15f91e4bd75d000008',
pageID : '553e2d15f91e4bd75d000009',
template : 'template1',
layout : 'home'
};
return service;
})
非常感谢
编辑
我已经改变了服务如下
app.factory('SharedData', function($http) {
service = {};
$http.get('config.json')
.success (function(data) {
service.siteId = data._id;
//console.log(service.siteId);
$http.get('/api/sites/' + service.siteId)
.success(function(site) {
service.template = site.template;
//console.log(service.template);
})
})
service.pageID = '553e2d15f91e4bd75d000009';
service.layout = 'home'
return service
})
在controller console.log(服务)中,返回一个包含所有值的对象:
layout: "home"
pageID: "553e2d15f91e4bd75d000009"
siteId: "553e2d15f91e4bd75d000008"
template: "template1"
console.log('Layout is ' + service.layout); // return home
console.log('PageID is ' + service.pageID); // return 553e2d15f91e4bd75d000009
但是
不理解请帮助您的siteID变量被引用在$http.get方法的作用域之外 在函数上方定义siteID,如下所示:
app.service('SharedData', function($http) {
var siteID = '';
$http.get('config.json')
.success (function(data) {
siteID = data._id;
console.log(siteID); // return 553e2d15f91e4bd75d000008
$http.get('/api/sites/' + siteID)
.success(function(site) {
var template = site.template;
console.log(template); // return myTemplate
})
.error(function(data) {
console.log('Error: ' + data);
})
})
.error(function(data) {
console.log('Error: ' + data);
})
service = {
siteID : siteID, // return undefined
template : template,
};
return service;
})
您没有正确构造对象。您需要首先定义对象,然后将值指定给对象特性:
app.service('SharedData', function($http) {
var service = {
siteID : '', // return undefined
template : '',
};
$http.get('config.json')
.success (function(data) {
service.siteID = data._id;
console.log(siteID); // return 553e2d15f91e4bd75d000008
$http.get('/api/sites/' + siteID)
.success(function(site) {
service.template = site.template;
console.log(template); // return myTemplate
return service;
})
.error(function(data) {
console.log('Error: ' + data);
})
})
.error(function(data) {
console.log('Error: ' + data);
})
})
我不完全确定您是否正确理解如何在控制器中使用该服务,因此,下面是我设置的一个小演示:
我从谷歌集团得到了这个帮助 “您正在异步获取信息。简单地说,在您注销这些信息时,这些信息还不可用。只有当$http调用“完成”后,您的控制器中才会有可用的信息。 在调试器屏幕中,服务是一个“活动”对象,因此它会被更新。数据不是对象(此时),因此会被记录。 请看一看$q服务,了解承诺在网络中是如何工作的。” 下面是如何用$q解决这个问题
service = {};
app.service('GetSiteID', function ($http) {
return $http.get('config.json')
.then (function(response) {
service.siteID = response.data._id
return service.siteID
});
})
app.service('GetTemplateAndPages', function (GetSiteID, $http, $q) {
return GetSiteID
.then(function(id) {
return $http.get('/api/sites/' + id)
.then (function(response) {
var data = response.data;
service.template = response.data.template;
service.pages = response.data.pages;
return service.template;
return service.pages
})
})
})
app.service('SharedData', function (GetSiteID, GetTemplateAndPages, $q) {
return $q.all([GetSiteID, GetTemplateAndPages])
.then (function(response) {
return service
})
})
然后在控制器中使用它,就像
app.controller('pagesController', function(SharedData, $scope, $http) {
SharedData.then(function(service) {
console.log(service);
console.log('Site ID is ' + service.siteID);
console.log('Template is ' + service.template);
console.log('Pages are ' + service.pages);
})
});
我觉得这样做有点乱。。。这样需要3个声明,其中两个仅作为最终服务对象的传递。是的,我同意。虽然OP的问题本质上是不理解对象范围。我得到的服务没有定义!是的,请尝试将
退货服务
转移到您的内部成功中,见上文。您不希望它在ajax调用完成后返回。它看起来还可以,但知道我不能在控制器中使用service.siteID或service.template,例如,我得到mydomain:3000//layouts/home.html,我应该得到mydomain:3000/templateValue/layouts/home.htmlBTW,我应该删除var服务中的var,否则我得到的服务是未定义的并用siteID=''替换siteID={}
app.controller('pagesController', function(SharedData, $scope, $http) {
SharedData.then(function(service) {
console.log(service);
console.log('Site ID is ' + service.siteID);
console.log('Template is ' + service.template);
console.log('Pages are ' + service.pages);
})
});