2015-04-29 41 views
0

我需要一些帮助来了解以下角度服务代码中的错误。角度服务问题

编辑: 我有不同的js文件数控制器使用CRUD API像

$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 
}) 

在控制器的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 

console.log('siteID is ' + service.siteId); // return undefined !!!!! 
console.log('template is ' + service.template); // return undefined !!!!! 

不明白,请帮助

回答

0

我得到这样的帮助,从谷歌集团

“你让你的信息异步简单地说,信息是不是日尚未公布。当你将它们注销时。只有当$ 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); 
    }) 
}); 
1

你的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; 
}) 
+0

我认为这是一个有点乱做这样...您需要3种声明,其中两种仅作为最终服务对象的传递。 – tpie

+0

是的,我同意。虽然OP的问题基本上不了解对象的范围。 –

1

您还没有构造对象正确。您需要首先定义对象,然后赋值给对象的属性:

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); 
    }) 



}) 

我不完全相信你的正确理解应该如何利用该服务在你的控制器,所以这里是一个小的演示我设置:

Services Demo

+0

我得到的服务未定义! – ZeGregg

+0

是啊尝试移动'返回serv冰在你内心的成功 – tpie

+0

见上面。你不希望它返回,直到你的ajax调用完成。 – tpie