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 guide和 the 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/