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元素添加元素?
答案 0 :(得分:1)
这不是代码评论论坛,但我想首先解决一些结构性问题,因为它们导致$add
的问题并且对讨论感到重要。< / p>
您正在同步所有projects
路径,但之后还有一个getById()
方法可以同步同步。而不是使用AngularFire的优势(为您提供绑定API),这种奇怪的语义结构迫使它进入CRUD范例并使用synchronized数组变得复杂。
$add
不存在的原因在于上述内容。 Projects
不是同步的AngularFire数组,而是您放置在它上面的奇怪包装器,因此$ add不存在是合理的。
所以要停止对我为什么不应该以这种奇怪的方式包装的想法,并且到达目的,你需要在调用$ add之前从你的包装器中提取数组:
Projects.getAll().$add( $scope.project );
最后一点,你试图将回调函数传递给$ add方法。仔细查看the guide和the API。您将看到所有这些方法都会返回承诺。因此,您的回调将像{I}一样移入.then
:
Projects.getAll().$add( $scope.project ).then( /* success function */, /* error function */ );
关于设计的最后一点注意事项:&#34;项目&#34;对象应该使用$asObject()
而不是$asArray()
来获取,因为它代表单个实体而不是集合。
希望有所帮助!