Javascript 角度服务问题

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

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

编辑: 我在不同的js文件中有几个控制器使用CRUDAPI,比如

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