Arrays 在Firebase阵列中移动项目
我一直在玩firebase API,遇到了一些麻烦 问题是我试图在数组中上移或下移一个项,但似乎不知道如何在Firebase API中做到这一点 这是我的控制器Arrays 在Firebase阵列中移动项目,arrays,angularjs,firebase,sync,angularfire,Arrays,Angularjs,Firebase,Sync,Angularfire,我一直在玩firebase API,遇到了一些麻烦 问题是我试图在数组中上移或下移一个项,但似乎不知道如何在Firebase API中做到这一点 这是我的控制器 angular.module('aceTrainingApp') .controller('AdminController',['$scope','FirebaseService', function ($scope, FirebaseService) { $scope.posts = FirebaseService.ge
angular.module('aceTrainingApp')
.controller('AdminController',['$scope','FirebaseService', function ($scope, FirebaseService) {
$scope.posts = FirebaseService.getPosts();
$scope.localPosts = $scope.posts; //is this Right??
$scope.newPost = {name: '', body: ''};
$scope.remove = function (id) {
FirebaseService.removePost(id);
};
$scope.updatePost = function (id) {
FirebaseService.updatePost(id);
$scope.newPost = {name: '', body: ''};
};
$scope.addPost = function() {
FirebaseService.addPost(angular.copy($scope.newPost));
};
//only trying to get moveDown working first
// $scope.moveUp = function(post) {
// var crntPos = $scope.posts.indexOf(post);
// if (crntPos > 0) {
// $scope.posts.splice(crntPos, 1);
// $scope.posts.splice(crntPos - 1, 0, post);
// }
// };
$scope.moveDown = function(post) {
var crntPos = $scope.localPosts.indexOf(post);
if (crntPos < $scope.localPosts.length) {
$scope.localPosts.splice(crntPos, 1);
$scope.localPosts.splice(crntPos + 1, 0, post);
FirebaseService.updateAllPosts($scope.localPosts);
}
};
}]);
HTML
&向下;
&向上箭头;
&时代;
问题是拼接方法仅适用于Firebase文档中提到的视图。有人能帮我修理一下上下移动功能吗
干杯我想您已经阅读了文档,并在这里看到了有用的博文: 由于您不必担心多个客户机同时写入数据,因此这使生活变得更轻松 我相信Firebase的好心人可以改进这个答案,但我的建议是在客户端进行管理,然后在适当的时间将整个阵列写回Firebase(无论是更改还是用户单击“保存”由您决定)。Firebase将检测到它是您正在编写的数组,并添加索引作为键,以0为第一位,以1秒为第二位,以此类推。这样你可以维持秩序 保持你的火力基地
$scope.posts = FirebaseService.getPosts();
还有一个本地的帖子数组,你可以把它写回Firebase
$scope.localPosts = [];
然后使用Splice
等操作localpost
准备好后,将
localPosts
写回Firebase。这种方法对我来说很有效,但我不确定这是否是我给你的好建议,所以提前向你道歉如果Firebase自己说这是一个“不-不”结果是,因为我的数组包含键包含“$”的对象,所以更新方法不起作用。更新方法也不正确
火基服务
var updatePost = function(id){
posts.$save(id);
};
var updateAllPosts = function(posts){
ref.set(posts);
};
管理员控制器
$scope.moveDown = function(post) {
var localPosts = [];
var crntPos = $scope.posts.indexOf(post);
if (crntPos < $scope.posts.length) {
$scope.posts.splice(crntPos, 1);
$scope.posts.splice(crntPos + 1, 0, post);
for(var i = 0; i < $scope.posts.length; i++){
var obj = {
name: $scope.posts[i].name,
body: $scope.posts[i].body
};
localPosts.push(obj);
}
FirebaseService.updateAllPosts(localPosts);
}
};
$scope.moveDown=函数(post){
var localPosts=[];
var crntPos=$scope.posts.indexOf(post);
if(crntPos<$scope.posts.length){
$scope.posts.拼接(crntPos,1);
$scope.posts.拼接(crntPos+1,0,post);
对于(变量i=0;i<$scope.posts.length;i++){
var obj={
名称:$scope.posts[i].name,
body:$scope.posts[i].body
};
localPosts.push(obj);
}
FirebaseService.updateAllPosts(localPosts);
}
};
是否有多个客户端将同时写入此阵列?不,不是这样,此功能是在管理页面中实现的。谢谢Tommy,我想我理解你的意思。不过还是有点困难。我的向下移动方法会变成这样吗<代码>$scope.moveDown=函数(post){$scope.localPosts=$scope.posts;var crntPos=$scope.localPosts.indexOf(post);if(crntPos<$scope.localPosts.length){$scope.localPosts.splice(crntPos,1);$scope.localPosts.splice(crntPos+1,0,post);}updatePost($scope.localPosts);}和updatePost=函数(posts){posts.$set(posts);}代码>是的,这是在正确的行上-试试看,如果有任何错误,请告诉我。好的,我的updatePost方法现在看起来像这样`var updatePost=function(position,post){ref.child(position.toString()).set(post)};`然而,我似乎得到了这个错误,它告诉我我使用设置不正确。错误:Firebase.set失败:第一个参数在属性“1”中包含无效键($id)。键必须是非空字符串,并且不能包含“.”、“$”、“/”、“[”、或“]”错误(本机)是的,我认为可能会发生这种情况,所以您的方向与我相同。您需要告诉Angular不要在数组中设置额外的值-使用ng repeat=“post as localPosts as$index”
我想-现在只需检查一下对不起track by$index
,所以在您显示本地帖子的视图中,可以使用如下内容:ng repeat=“post as localPosts track by$index”
var updatePost = function(id){
posts.$save(id);
};
var updateAllPosts = function(posts){
ref.set(posts);
};
$scope.moveDown = function(post) {
var localPosts = [];
var crntPos = $scope.posts.indexOf(post);
if (crntPos < $scope.posts.length) {
$scope.posts.splice(crntPos, 1);
$scope.posts.splice(crntPos + 1, 0, post);
for(var i = 0; i < $scope.posts.length; i++){
var obj = {
name: $scope.posts[i].name,
body: $scope.posts[i].body
};
localPosts.push(obj);
}
FirebaseService.updateAllPosts(localPosts);
}
};