This jsfiddle是angularfire文档中“创建AngularFire服务”部分的示例。

如您所见,控制器应该使用以下命令添加新项目:

.controller('CreateCtrl', function($scope, $location, $timeout, Projects) {
  $scope.save = function() {
    Projects.$add($scope.project, function() {
      $timeout(function() { $location.path('/'); });
    });
  };
})


并且如果您尝试执行此操作,还将看到它不起作用,并且开发控制台还将显示错误“未定义不是函数”,指向此行:

 Projects.$add($scope.project, function() {


如何解决?
从本质上讲,我要问的是:如何使用AngularFire扩展服务向Firebase元素添加元素?

最佳答案

这不是一个代码评论论坛,但是我想首先解决一些结构性问题,因为它们导致了$add问题,并且对讨论很重要。

您正在同步所有projects路径,但是还有一个getById()方法可以再次同步相同的数据。这种奇怪的语义结构没有使用AngularFire的优势(为您提供了绑定API),而是将其强制为CRUD范例,并使用同步数组使其复杂化。

$add不存在的原因在于上面。 Projects不是同步的AngularFire数组,而是放置在其上的奇数包装,因此$ add不存在是有道理的。

因此,为了避免困扰我为什么不应该以这种奇怪的方式包装它的想法,并直言不讳,您需要在调用$ add之前从包装器中提取数组:

 Projects.getAll().$add( $scope.project );


最后一点,您试图将回调函数传递给$ add方法。请仔细查看the guidethe API。您会看到所有这些方法都返回了promise。因此,您的回调将被移到.then中,如下所示:

 Projects.getAll().$add( $scope.project ).then( /* success function */, /* error function  */ );


关于设计的最后一点:应该使用$asObject()而不是$asArray()来获取“项目”对象,因为它表示单个实体而不是集合。

希望有帮助!

10-07 20:56