Javascript Can';似乎无法访问json数据的特定元素
我有一个Angular应用程序,带有访问服务的控制器。我让服务正确地将数据发送回我的控制器,但在Javascript Can';似乎无法访问json数据的特定元素,javascript,angularjs,json,Javascript,Angularjs,Json,我有一个Angular应用程序,带有访问服务的控制器。我让服务正确地将数据发送回我的控制器,但在函数中,我似乎无法访问json数据的特定元素 控制器(代码段) 样本数据 如果我做了console.log(数据)它打印到我的浏览器控制台。但是我尝试将一个变量设置为data,然后在函数外部打印它,但它不会。我也不能访问json对象的任何特定部分 我相信这有一个简单的解释,但我似乎在任何地方都找不到 编辑(添加服务代码) 编辑以澄清 vm.getData = function(eventid) {
函数中,我似乎无法访问json数据的特定元素
控制器(代码段)
样本数据
如果我做了console.log(数据)代码>它打印到我的浏览器控制台。但是我尝试将一个变量设置为data
,然后在函数外部打印它,但它不会。我也不能访问json对象的任何特定部分
我相信这有一个简单的解释,但我似乎在任何地方都找不到
编辑(添加服务代码)
编辑以澄清
vm.getData = function(eventid) {
monitorData.requestEvent(eventid)
.then(function(data) {
console.log(data.id);
})
.catch(function(e) {
console.log("Error");
});
return false;
};
vm.getData($routeParams.eventid);
由于用户之前的困惑,让我试着更清楚一点:在我上面的控制器代码中,您将看到
.then(function(data) {
// console.log(data);
vm.event.id = data.id;
})
在这个代码段中,您将看到数据
。该数据包含我在上面列出的对象(示例数据)
我的问题是,有没有办法进一步访问id、type、time。。。电话,备忘
。我可以console.log(data)
,它会在控制台中打印出对象(用于测试),但我需要访问对象中的每个项目,并在整个vm.getData
函数之外使用它
以前有人说过“这不可能”,其他人会同意吗 据我所知,此控制器绑定到特定的资源视图(某些事件的详细信息)
以下是实现您愿望的两种方法:
在状态定义中使用resolve
子句(我认为这更优雅):
缓存承诺的结果:
var promise;
vm.getData = function(eventid) {
promise = monitorData.requestEvent(eventid)
.then(function(data) {
// console.log(data);
vm.event.id = data.id;
})
.catch(function(e) {
console.log("Error");
});
return false;
};
//Wherever you need the results of the promise just use the cached version
//Note: this might fail if you depend on this promise when your controller first loads.
promise.then(function(data){
//data.id available here
});
解决这个问题的方法是在服务中
。问题是我返回了以下内容:
(WRONG)
return $http.get('/api/event/' + eventid);
所以我改为附加了一个。然后
函数来链接承诺。我还返回了数据
,而我本应该返回响应。数据
。请参阅下面的代码:
(RIGHT)
return $http.get('/api/event/' + eventid).then(function(response) {
return response.data;
});
最后的服务:
(function() {
angular
.module('monitorApp')
.service('monitorData', monitorData);
monitorData.$inject = ['$http'];
function monitorData($http) {
var requestEvent = function(eventid) {
return $http.get('/api/event/' + eventid).then(function(response) {
return response.data;
});
};
return {
requestEvent : requestEvent,
};
}
})();
最终的控制器
vm.getData = function(eventid) {
monitorData.requestEvent(eventid)
.then(function(data) {
console.log(data.id);
})
.catch(function(e) {
console.log("Error");
});
return false;
};
vm.getData($routeParams.eventid);
结论
因此,现在我可以通过使用服务
和一系列承诺,在我的控制器
中成功地进行api调用。当我将添加到返回return response.data的return语句中时,解决方案就出现了代码>。我认为,如果api调用需要很长时间,这应该仍然有效。我可以很容易地在控制器代码中的monitorData.requestEvent(eventid)
之前添加一个等待指示器,然后当语句被激活时,我可以删除等待指示器 怎么了?控制台中有消息吗?没有错误。如果我执行vm.event.id=data
操作,我将获得整个对象。如果我做了vm.event.id=data.id
我什么也得不到,没有错误,没有对象,什么也得不到。“我相信这有一个简单的解释”-异步性。感谢@dfsq给出了一个好的方向,但新问题更像是一个关于最佳实践的讲座,我看不到任何具体的东西可以适用于我的情况。您是否可以打开我的问题,或者用代码帮助我了解如何读取承诺中的数据
?您是否阅读了重复问题中的答案?有“使用承诺”一节。这正是你需要做的。非常感谢你花时间回答并帮助我。我想这很接近。我在app.js中使用ng路由,路由是。当('/event/:eventid',{templateUrl:'bundles/app\u client/event/event.view.html',controller:'eventCtrl',controllerAs:'vm'})时。因此,我喜欢第一种方法,我是简单地更改当前路线,还是需要更改。当
更改为。状态
?不,您可以更改当前路线.state
用于我指定的ui路由器
。如果使用ng路由,我还会使用$stateParams和$state
?或者我需要一个额外的图书馆?它只是说未知提供者。
(RIGHT)
return $http.get('/api/event/' + eventid).then(function(response) {
return response.data;
});
(function() {
angular
.module('monitorApp')
.service('monitorData', monitorData);
monitorData.$inject = ['$http'];
function monitorData($http) {
var requestEvent = function(eventid) {
return $http.get('/api/event/' + eventid).then(function(response) {
return response.data;
});
};
return {
requestEvent : requestEvent,
};
}
})();
vm.getData = function(eventid) {
monitorData.requestEvent(eventid)
.then(function(data) {
console.log(data.id);
})
.catch(function(e) {
console.log("Error");
});
return false;
};
vm.getData($routeParams.eventid);