Javascript 通过扩展的AngularFire 0.82服务添加新元素

Javascript 通过扩展的AngularFire 0.82服务添加新元素,javascript,angularjs,firebase,angularfire,Javascript,Angularjs,Firebase,Angularfire,作为AngularFire文档中“创建AngularFire服务”部分的示例编写 如您所见,控制器应使用以下方式添加新项目: .controller('CreateCtrl', function($scope, $location, $timeout, Projects) { $scope.save = function() { Projects.$add($scope.project, function() { $timeout(function() { $locati

作为AngularFire文档中“创建AngularFire服务”部分的示例编写

如您所见,控制器应使用以下方式添加新项目:

.controller('CreateCtrl', function($scope, $location, $timeout, Projects) {
  $scope.save = function() {
    Projects.$add($scope.project, function() {
      $timeout(function() { $location.path('/'); });
    });
  };
})
如果您尝试这样做,您还将看到它不起作用,并且开发人员控制台还会显示错误“undefined is not a function”(未定义不是函数),指向这一行:

 Projects.$add($scope.project, function() {
如何解决这个问题?
基本上,我要问的是:如何使用AngularFire扩展服务向firebase元素添加元素?

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

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

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

因此,为了停止重复我的想法,即为什么不应该以这种奇怪的方式包装它,并切中要害,您需要在调用$add之前从包装器中提取数组:

 Projects.getAll().$add( $scope.project );
最后一点注意,您试图将回调函数传递到$add方法中。仔细看一看,然后。您将看到所有这些方法都返回承诺。因此,您的回调将被移动到
。然后像这样

 Projects.getAll().$add( $scope.project ).then( /* success function */, /* error function  */ );
关于设计的最后一个注意事项:“project”对象可能应该使用
$asObject()
而不是
$asArray()
获取,因为它表示单个实体而不是集合

希望有帮助