无法正确处理JSON对象

时间:2016-02-10 11:20:34

标签: javascript angularjs json

我正在Angular.js做一些测试,并且已经在这里问了几件事。现在,我发现了一个奇怪的错误,我无法找到解决方案;我希望你能做到与众不同!

这很简单:我使用这个服务来检索JSON(尚未测试测试部分,但负载工作正常):

svcs.service('dataMod', ['$http', '$q', function($http, $q){

    return{
        manage: manage
    }

    function manage(filename, action, data){
        var defered = $q.defer();
        var promise = defered.promise;

        if(action == "save"){
            $http.post(filename, data).then(function(){
                console.log("Data write success");
            }, function(){
                console.log("Error writing data");
            });
        }else{
            $http.get(filename)
                .success(function(data){
                    defered.resolve(data);
                    console.log("Data resolved");
                    console.log(">> "+JSON.stringify(data.regs));
                })
                .error(function(err){
                    defered.reject(err);
                });
            return promise;
        }
    }
}]);

我将它注入我的控制器模块并在此处使用:

$scope.data = dataMod.manage("data/registries.json", "load");

它有效,因为当我使用console.log 检查$ scope.data变量时,我会在浏览器中看到它:

http://i.imgur.com/cfb3O4v.png

所以你可能会问......问题是什么?好吧,通常我应该以这样的方式迭代这个JSON:$ scope.data.regs [index] .object_variable,不是吗?或者像data.regs中的reg一样使用ng-repeat。但它只是行不通。

当我尝试执行console.log($ scope.data.regs)时,我得到“未定义”,并且我一直在尝试各种方式来获取信息,但我永远都不能!

我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

首先:

无需使用Items.put("image", base64EncodeDecode.encodeToBase64(image));$qdeferred。您应该在promisereturn之前添加$http.get,因为它们是自己的承诺。

第二

$http.post成功函数返回带有$http参数的响应。 因此,在您的情况下,您可以使用data

检查返回的数据

在成功块的最后,只需返回它:

data.data.regs

希望这有帮助!

答案 1 :(得分:1)

我相信你误解了承诺是如何运作的。 Promise不会将自己解析为数据,因此它们对变量不起作用。

  

这不起作用

function! s:NoHLAfter(n)
  if (localtime() - g:nohl_starttime) >= a:n
    call <SID>Onnohl()
  endif
endfunction

function! s:Onnohl()
  set nohlsearch
  augroup AutoNohl
    au!
  augroup END
endfunction

function! s:Onsearch()
  set hlsearch
  nohlsearch
  let g:nohl_starttime = localtime()
  augroup AutoNohl
    au!
    " autocmd CursorHold,CursorMoved * call <SID>NoHLAfter(4)
    " only do it on CursorMoved: We sometimes 'hold' and look at the
    " findings.
    autocmd CursorMoved * call <SID>NoHLAfter(4)
  augroup END
endfunction

noremap n :call <SID>Onsearch()<cr>n
noremap N :call <SID>Onsearch()<cr>N
noremap / :call <SID>Onsearch()<cr>/
noremap ? :call <SID>Onsearch()<cr>?

此处$scope.data = dataMod.manage("data/registries.json", "load"); 是来自$scope.data的承诺,因此您可以dataMod.manage

  

这将

$scope.data.then(handler, handler).finally(handler)

虽然正如simalexan所提到的那样$ http返回承诺它有两个特殊的回调dataMod.manage("data/registries.json", "load").then(function(fileData){ $scope.data = fileData }) success

error

然后在控制器中

svcs.service('dataMod', ['$http', '$q',
    function ($http, $q) {
        return {
            manage: manage
        }

        function manage(filename, action, data) {
            if(action == "save") {
                return $http.post(filename, data)
            } else {
                return $http.get(filename)
            }
        }
    }
]);