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 guide和the API。您会看到所有这些方法都返回了promise。因此,您的回调将被移到
.then
中,如下所示: Projects.getAll().$add( $scope.project ).then( /* success function */, /* error function */ );
关于设计的最后一点:应该使用
$asObject()
而不是$asArray()
来获取“项目”对象,因为它表示单个实体而不是集合。希望有帮助!