【发布时间】:2015-02-06 15:46:22
【问题描述】:
我正在尝试使用 firebase 和 angularfire 进行 3 路数据绑定。你可以看到我在 Plunker 中得到了什么:http://plnkr.co/edit/RGA4jZK3Y6n4RkPCHK37
app.js:
angular.module('ideaBattle', ["firebase"]);
服务:
angular
.module('ideaBattle')
.constant('FBURL', 'https://ideabattle.firebaseio.com/')
.service('Ref', ['FBURL', Firebase])
.factory('dataBank', function(Ref, $firebase) {
return $firebase(Ref).$asArray();
});
控制器:
angular
.module('ideaBattle')
.controller('ideaListCtrl', displayIdeas);
displayIdeas.$inject = ['dataBank'];
function displayIdeas(dataBank){
var vm = this;
vm.ideas = dataBank;
vm.upVote = function(idea){
vm.ideas[idea.id].votes++;
};
}
HTML:
<div ng-controller="ideaListCtrl as vm">
<div ng-repeat="idea in vm.ideas | orderBy: '-votes'">
<div>
<h2>{{idea.name}}</h2>
<p>{{idea.desc|limitTo: 190}}</p>
<span class="btn" ng-click="vm.upVote(idea)">Vote! <span class="badge"> {{idea.votes}}</span></span>
</div>
</div>
</div>
Plunker 版本:http://plnkr.co/edit/RGA4jZK3Y6n4RkPCHK37
它的作用是从 firebase 获取数据并正确显示,但是当我按下按钮调用 upVote 函数时,它只会在本地更新。我知道为什么它只能在本地工作,但我不知道如何让它也在 firebase 中更新。
我尝试过使用 $bindTo,但据我了解,它需要 $scope 才能工作,并且我正在尝试使用“Controller as vm”模式而不注入 $scope。
谁能告诉我怎么咬它?
【问题讨论】:
-
你打过$save()吗,see the documentation
-
据我了解,$save 是一个函数,每次我想要更新 firebase 时都需要调用它。这不是我真正想要的方法。我想要更多“一劳永逸”的三向数据绑定,以便对本地数据所做的每一次更改都会反映在 firebase 中。我知道可以使用 $bindTo($scope, "data") 方法轻松完成,但我根本不想使用 $scope,因此我的问题是,如何保持这种模式。
-
vm.ideas[idea.id].votes++; vm.ideas.$save(idea.id).then(function(ref) { ref.key() === vm-ideas[idea.id].$id; // true });
-
这行得通 - 当然,但它仍然不是 3 路数据绑定 - 只是更新 firebase 的功能。我需要在任何我进行更改的地方调用它,但我希望它是自动的,就像它在本地(2 路数据绑定)一样。我知道这是可以做到的。我不知道怎么做。
-
好吧,一切都只是一个函数。尝试extending Array factory,保持干燥
标签: javascript angularjs firebase angularfire