Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在Firebase阵列中移动项目_Arrays_Angularjs_Firebase_Sync_Angularfire - Fatal编程技术网

Arrays 在Firebase阵列中移动项目

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

我一直在玩firebase API,遇到了一些麻烦

问题是我试图在数组中上移或下移一个项,但似乎不知道如何在Firebase API中做到这一点

这是我的控制器

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);
            }
        };