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

时间:2014-11-11 15:33:13

标签: javascript angularjs firebase angularfire

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

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

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

如果你尝试这样做,你也会发现它不起作用,而开发控制台也会显示错误“undefined is is a function”指向这一行:

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

如何解决这个问题? 从根本上说,我要问的是:如何使用AngularFire扩展服务向firebase元素添加元素?

1 个答案:

答案 0 :(得分:1)

这不是代码评论论坛,但我想首先解决一些结构性问题,因为它们导致$add的问题并且对讨论感到重要。< / p>

您正在同步所有projects路径,但之后还有一个getById()方法可以同步同步。而不是使用AngularFire的优势(为您提供绑定API),这种奇怪的语义结构迫使它进入CRUD范例并使用synchronized数组变得复杂。

$add不存在的原因在于上述内容。 Projects不是同步的AngularFire数组,而是您放置在它上面的奇怪包装器,因此$ add不存在是合理的。

所以要停止对我为什么不应该以这种奇怪的方式包装的想法,并且到达目的,你需要在调用$ add之前从你的包装器中提取数组:

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

最后一点,你试图将回调函数传递给$ add方法。仔细查看the guidethe API。您将看到所有这些方法都会返回承诺。因此,您的回调将像{I}一样移入.then

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

关于设计的最后一点注意事项:&#34;项目&#34;对象应该使用$asObject()而不是$asArray()来获取,因为它代表单个实体而不是集合。

希望有所帮助!