作者:胡龙云积极_622 | 来源:互联网 | 2023-05-17 14:11
我使用angularfire 1.0.0从我的firebase中获取一个唯一项目时遇到问题.为了澄清,我希望我的应用程序获取一个给定一个唯一的firebase id的帖子,例如"-JkZwz-tyYoRLoRqlI_I".它适用于在应用程序中导航,例如单击指向特定帖子的链接,但不会刷新.我的猜测是它与同步有关.现在它可以在获取所有帖子并在ng-repeat中使用它时起作用.这是导航到页面时为什么它适用于一个项目的线索.这应该不是很难,因为这应该是一个非常标准的操作,但我不能让它工作.我到处搜索,但实际上没有这方面的指南.在他们提到的API中$getRecord(key)
返回给定键的数组记录.如果未找到密钥,则返回null.此方法利用$ indexFor(key)查找相应的记录.
但这不符合预期.或者我错过了什么?
它适用于ng-repeat,如下所示:
{{postt.title}}
{{postt.timestamp}}
{{postt.content}}
但不是像这样的独特项目:
{{post.title}}
{{post.timestamp}}
{{post.content}}
这是服务:
'use strict';
angular.module('app.module.blog.post')
.factory("PostService", ["$firebaseArray", "FIREBASE_URL", function($firebaseArray, FIREBASE_URL) {
var ref = new Firebase(FIREBASE_URL + "posts");
var posts = $firebaseArray(ref);
return {
all: posts, // ng-repeat on this works fine
last: function(nr) {
var query = ref.orderByChild("timestamp").limitToLast(nr);
return $firebaseArray(query); // ng-repeat on this work fine to
},
create: function (post) {
return posts.$add(post);
},
get: function (postId) {
console.log(postId); // This is -JkZwz-tyYoRLoRqlI_I
var post = posts.$getRecord(postId);
console.log(post); // This print null
return post;
},
delete: function (post) {
return posts.$remove(post);
}
};
}]);
正如评论在get函数中所说的那样,postId就在那里,并且也设置了帖子,但帖子是null.
这是控制器
'use strict';
angular.module('app.module.blog.post', [])
.controller('PostCtrl', ['$scope', '$routeParams', 'PostService', function($scope, $routeParams, PostService) {
// This returns e.g. postId "-JkZwz-tyYoRLoRqlI_I"
console.log($routeParams.postId);
$scope.post = PostService.get($routeParams.postId);
$scope.posts = PostService.all; // Illustrates the example not actually in this controller otherwise
}]);
这是firebase数据库中的内容的示例
posts
-JkUnVsGnCqbAxbMailo
comments
content: ...
timestamp: ...
title: ...
-JkZwz-tyYoRLoRqlI_I
comments
content: ...
timestamp: ...
title: ...
-JkhaEf9tQy06cOF03Ts
content: ...
timestamp: ...
title: ...
我发现这个问题非常奇怪,因为它应该是非常标准的.我显然错过了一些东西,但无法解决这个问题.很感谢任何形式的帮助!
提前致谢!
1> Jean-Philipp..:
我知道$ getRecord()函数的文档有点误导.你实际得到的$firebaseArray
是数组的承诺.这意味着您的posts
变量将在未来的某个时间点包含您的帖子.话虽这么说,似乎该$getRecord
功能仅在承诺解决后才有效,即从Firebase下载阵列时.为了确保在调用$getRecord
函数时解析了promise ,您可以使用$loaded()
promise:
var posts = $firebaseArray(ref);
posts.$loaded().then(function(x) {
var post = x.$getRecord(postId);
console.log(post);
}).catch(function(error) {
console.log("Error:", error);
});
如果你想知道它为什么适用ng-repeat
,那是因为Angular知道posts
变量是一个promise并等待它在渲染值之前被解析.