我正在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)时,我得到“未定义”,并且我一直在尝试各种方式来获取信息,但我永远都不能!
我在这里做错了什么?
答案 0 :(得分:1)
首先:
无需使用Items.put("image", base64EncodeDecode.encodeToBase64(image));
,$q
和deferred
。您应该在promise
和return
之前添加$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)
}
}
}
]);