Javascript Can';似乎无法访问json数据的特定元素

Javascript Can';似乎无法访问json数据的特定元素,javascript,angularjs,json,Javascript,Angularjs,Json,我有一个Angular应用程序,带有访问服务的控制器。我让服务正确地将数据发送回我的控制器,但在函数中,我似乎无法访问json数据的特定元素 控制器(代码段) 样本数据 如果我做了console.log(数据)它打印到我的浏览器控制台。但是我尝试将一个变量设置为data,然后在函数外部打印它,但它不会。我也不能访问json对象的任何特定部分 我相信这有一个简单的解释,但我似乎在任何地方都找不到 编辑(添加服务代码) 编辑以澄清 vm.getData = function(eventid) {

我有一个Angular应用程序,带有访问服务的控制器。我让服务正确地将数据发送回我的控制器,但在
函数中,我似乎无法访问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);