TypeError: undefined is not a function while submitting & deleting post using AngularFire and AngularJS (ThinksterIO Tutorial Chapter 7)

旧时模样 提交于 2019-12-25 11:59:40

问题


I've run into multiple TypeErrors with the Thinkster.io AngularJS Tutorial: Learn to build Modern Webapps Chapter 7. Creating your own user data using firebase since the tutorial is now outdated after AngularFire was upgraded to v0.8.0. Specifically the .$child() and .$on() methods have been taken out. Here is the change log

https://github.com/firebase/angularfire/releases/tag/v0.8.0

After getting help solving my initial TypeError issues during registering a new user, I began to see 2 new TypeErrors show up when I submit a post and when I try to delete a post. Once again the culprits are the outdated .$child() and .$on() methods.

Submitting a Post > TypeError: undefined is not a function

After submitting a post I see the following TypeError show up in the console

This TypeError points to the post.js service

TypeError: undefined is not a function
    at http://localhost:9000/scripts/services/post.js:16:11

which is line 16, column 11 at the beginning of the $child method call. Also, note the second .&child() following the first. That will result in another TypeError.

return posts.$add(post).then(function(ref) {
  var postId = ref.name();
  user.$child('posts').$child(postId).$set(postId);
  return postId;
});

I will mention that even though I get this TypeError, I'm still able to successfully create a post and I see it in the Forge and in the app's post list.

Deleting a Post > TypeError: undefined is not a function

When I try to delete a post that I just created I get another TypeError related to the now deprecated .$on() method.

TypeError: undefined is not a function
    at Object.Post [as delete] (http://localhost:9000/scripts/services/post.js:27:10)
    at Scope.$scope.deletePost (http://localhost:9000/scripts/controllers/posts.js:10:14)

which points to the .$on() in this code in the post.js service

delete: function(postId) {
  if(User.signedIn()) {
    var post = Post.find(postId);
    post.$on('loaded', function(){
      var user = User.findByUsername(post.owner);
      posts.$remove(postId).then(function(){
        user.$child('posts').$remove(postId);
      });
    });
  }
}

I realize that I will have to do something like

post.$loaded(function(result) {Chapter 7. Creating your own user data using firebase
  // something related to finding user of post
  // remove post from posts collection 
  // but of course we can't use .$child()
});

but the problem is that when a JS beginner like me comes along faced with the AngularFire change logs and API, I just get lost and overwhelmed to the point of shut down. Any guidance is greatly appreciated as always.


FILES


post.js service

'use strict';

app.factory('Post', function($firebase, FIREBASE_URL, User){
  var ref = new Firebase(FIREBASE_URL + 'posts');
  var posts = $firebase(ref).$asArray();

  var Post = {
    all: posts,
    create: function(post) {
      if(User.signedIn()) {
        var user = User.getCurrent();
        post.owner = user.username;

        return posts.$add(post).then(function(ref) {
          var postId = ref.name();
          user.$child('posts').$child(postId).$set(postId);
          return postId;
        });
      }
    },
    find: function(postId) {
            return $firebase(ref.child(postId)).$asObject();
    },
    delete: function(postId) {
      if(User.signedIn()) {
        var post = Post.find(postId);
        post.$on('loaded', function(){
          var user = User.findByUsername(post.owner);
          posts.$remove(postId).then(function(){
            user.$child('posts').$remove(postId);
          });
        });
      }
    }
  };

  return Post;

});

post.js controller

'use strict';

app.controller('PostsCtrl', function($scope, $location, Post) {

  $scope.posts = Post.all;

  $scope.post = {url: 'http://', title: ''};

  $scope.deletePost = function(post) {
    Post.delete(post);
  };

});

回答1:


I was fed up, so I took a easy approach (just to get trough the tutorial). I created userRef (this should come from the User object imo):

modulename.factory("Post", function ($firebase, FIREBASE_URL, User) {
    //rest code

    var userRef = new Firebase(FIREBASE_URL + "users");

    var Post = {
        create: function(){
            //rest of the code

            return posts.$add(post).then(function (ref) {
                var postId = ref.name();

                userRef.child(user.$id).child("posts").child(postId).set(postId);

                return postId;
            });
        }
    }
});

This is just one approach, when I was searching for a good solution, I saw some more example codes. I hope it helps a little bit.



来源:https://stackoverflow.com/questions/25692853/typeerror-undefined-is-not-a-function-while-submitting-deleting-post-using-an

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!