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

标签 javascript angularjs firebase angularfire

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

如您所见, Controller 应该使用以下命令添加一个新项目:

.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 的优势(为您提供绑定(bind) 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() 获取,因为它代表单个实体,并且不是一个集合。

希望有帮助!

关于javascript - 通过扩展的 AngularFire 0.82 服务添加新元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26868468/

相关文章:

firebase - 如何使用控制台在 firebase 实时数据库中添加根级节点

javascript - 检查关键字的 URL 片段

javascript - jQuery 只允许数字、小数点或百分号

javascript - Angular 逃逸边界值如何?

javascript - 为什么多个指令不能在同一个元素上请求一个独立的作用域?

firebase - 如何限制 Firebase Firestore 集合中的文档

javascript - AJAX/JQuery 函数未定义

javascript - 我可以多次调用 fbq ('init' ) 以使用新的像素功能吗?

javascript - 如何在 html 中使用 ng-repeat 和索引

ios - 异步加载 - UITableView 和 Firebase