AngularFire $remove item from Array 使用 Firebase 参考中的变量不起作用 [英] AngularFire $remove item from Array using a variable in Firebase reference does not work

查看:22
本文介绍了AngularFire $remove item from Array 使用 Firebase 参考中的变量不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在努力解决以下问题:

我正在尝试使用在 Angular 服务(工厂)中实现的 $remove AngularFire 方法从 Firebase 阵列中删除发布"项目.此帖子是事件"的子项,因此为了删除它,我必须向此服务传递一个参数,其中包含我要删除帖子的相关事件.

这是我的控制器:

app.controller('EventSignupController', function ($scope, $routeParams, EventService, AuthService) {//通过 eventservice 使用 firebase 加载选定的事件$scope.selectedEvent = EventService.events.get($routeParams.eventId);//获取用户设置$scope.user = AuthService.user;$scope.signedIn = AuthService.signedIn;//消息功能$scope.posts = EventService.posts.all($scope.selectedEvent.$id);$scope.post = {信息: ''};$scope.addPost = 函数 (){$scope.post.creator = $scope.user.profile.username;$scope.post.creatorUID = $scope.user.uid;EventService.posts.createPost($scope.selectedEvent.$id, $scope.post);};$scope.deletePost = function(post){EventService.posts.deletePost($scope.selectedEvent.$id, post);//eventService 错误的解决方法://$scope.posts.$remove(post);};});

这是我的服务(工厂):

app.factory('EventService', function ($firebase, FIREBASE_URL) {var ref = new Firebase(FIREBASE_URL);var events = $firebase(ref.child('events')).$asArray();var 事件服务 = {事件:{所有:事件,创建:函数(事件){返回事件.$add(event);},得到:函数(事件ID){返回 $firebase(ref.child('events').child(eventId)).$asObject();},删除:函数(事件){返回 events.$remove(event);}},帖子:{所有:功能(事件ID){var posts = $firebase(ref.child('events').child(eventId).child('posts')).$asArray();回帖;},createPost: 函数 (eventId, post) {//这确实有效var posts = $firebase(ref.child('events').child(eventId).child('posts')).$asArray();返回posts.$add(post);},deletePost: 函数 (eventId, post) {//这不起作用var posts = $firebase(ref.child('events').child(eventId).child('posts')).$asArray();返回posts.$remove(post);}}};返回事件服务;});

当我尝试删除链接标签时,它会冻结并且控制台中没有出现错误日志.虽然如果我直接在我的控制器中对 $scope.posts 调用 $remove ,它会神奇地工作.此外,我的 Post 不会从我的 Firebase 数据库中删除.

另一件奇怪的事情是CreatePost"使用相同的结构可以很好地工作.

我的观点:

 

<form ng-submit="addPost()" ng-show="signedIn()"><input type="text" ng-model="post.message"/><button type="submit" class="btn btn-primary btn-sm">添加帖子</button></表单><br><div class="post row" ng-repeat="post in posts"><div><div class="信息">{{ post.message }}

<div><span>由{{ post.creator }}提交</span><a href="" ng-click="deletePost(post)" ng-show="user.uid === post.creatorUID">删除</a>

<br>

附言我不太确定我的服务"是否以最好的方式实现..我找不到另一个解决方案来进行多次 firebase 调用

var posts = $firebase(ref.child('events').child(eventId).child('posts')).$asArray();

在我的 EventService 的 Post 部分中,因为它取决于每个 CRUD 操作中的 eventId.任何想法都会非常受欢迎:)

解决方案

对我来说最简单的方法是使用这个:

var ref= new Firebase('https://Yourapp.firebaseio.com/YourObjectName');ref.child(postId).remove(function(error){如果(错误){console.log("错误:", 错误);} 别的 {console.log("删除成功!");}});

I've been struggling with the following problem:

I'm trying to delete a 'Post' item from a Firebase Array with the $remove AngularFire method which I have implemented in a Angular Service (Factory). This Post is a child of 'Event', so in order to delete it I have to pass this Service a argument with the relevant Event of which I want to delete the post.

This is my controller:

app.controller('EventSignupController', function ($scope, $routeParams, EventService, AuthService) {
  // Load the selected event with firebase through the eventservice
  $scope.selectedEvent = EventService.events.get($routeParams.eventId);

  // get user settings
  $scope.user =  AuthService.user;
  $scope.signedIn = AuthService.signedIn;

  // Message functionality
  $scope.posts = EventService.posts.all($scope.selectedEvent.$id);

  $scope.post = {
    message: ''
  };
  $scope.addPost = function (){
    $scope.post.creator = $scope.user.profile.username;
    $scope.post.creatorUID = $scope.user.uid;
    EventService.posts.createPost($scope.selectedEvent.$id, $scope.post);
  };

  $scope.deletePost = function(post){
    EventService.posts.deletePost($scope.selectedEvent.$id, post);
    // workaround for eventService bug:
    // $scope.posts.$remove(post);
  };
});

And this is my Service (Factory):

app.factory('EventService', function ($firebase, FIREBASE_URL) {
  var ref = new Firebase(FIREBASE_URL);
  var events = $firebase(ref.child('events')).$asArray();

  var EventService = {
    events: {
      all: events,
      create: function (event) {
        return events.$add(event);
      },
      get: function (eventId) {
        return $firebase(ref.child('events').child(eventId)).$asObject();
      },
      delete: function (event) {
        return events.$remove(event);
      }
    },
    posts: {
      all: function(eventId){
        var posts = $firebase(ref.child('events').child(eventId).child('posts')).$asArray();
        return posts;
      },
      createPost: function (eventId, post) {
        // this does work
        var posts = $firebase(ref.child('events').child(eventId).child('posts')).$asArray();
        return posts.$add(post);
      },
      deletePost: function (eventId, post) {
        // this does not work
        var posts = $firebase(ref.child('events').child(eventId).child('posts')).$asArray();
        return posts.$remove(post);
      }
    }
  };

  return EventService;
});

When I try to delete the link tag just freezes and no error logging appears in the console. While if I call $remove on my $scope.posts directly in my controller it magically works.. Furthermore my Post is not removed from my Firebase DB.

Another weird thing is that 'CreatePost' works perfectly fine using the same construction.

My view:

 <div class="col-xs-8 col-xs-offset-2 well">
        <form ng-submit="addPost()" ng-show="signedIn()">
          <input type="text" ng-model="post.message" />
          <button type="submit" class="btn btn-primary btn-sm">Add Post</button>
        </form>
        <br>
        <div class="post row" ng-repeat="post in posts">
          <div>
            <div class="info">
                {{ post.message }}
            </div>
            <div>
              <span>submitted by {{ post.creator }}</span>
              <a href="" ng-click="deletePost(post)" ng-show="user.uid === post.creatorUID">delete</a>
            </div>
            <br>
          </div>
        </div>
      </div>

P.s. I'm not too sure that my 'Service' is implemented in the best possible way.. I couldn't find another solution for doing multiple firebase calls

var posts = $firebase(ref.child('events').child(eventId).child('posts')).$asArray();

within the Post part of my EventService, because it depends on eventId in each CRUD operation. Any ideas would be very welcome :)

解决方案

The easiest way for me was to use this:

var ref= new Firebase('https://Yourapp.firebaseio.com/YourObjectName');
ref.child(postId).remove(function(error){
    if (error) {
    console.log("Error:", error);
  } else {
    console.log("Removed successfully!");
  }
});

这篇关于AngularFire $remove item from Array 使用 Firebase 参考中的变量不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
其他开发最新文章
热门教程
热门工具
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆