Firebase:$ save上的更新项目时间戳

时间:2015-04-20 20:47:35

标签: angularjs firebase angularfire

我正试图了解如何更新Firebase项目的updatedAt时间戳。

更新的thing.namething.description已更新为该对象,但我无法确定如何更新时间戳,即使我已将其传递给{{ 1}}对象。

这是我目前的代码:

HTML

editedThing

JS

<h1>You are editing </h1>
<section class="unit">
  <form ng-submit="updateThing(selectedThing)">
    <input type="text" name="name" ng-model="selectedThing.name" value=""><br>
    <input type="text" name="name" ng-model="selectedThing.description" value="">
    <button type="submit">Submit</button>
  </form>
</section>

如果我更新var ref = new Firebase(FBURL); var thingsRef = ref.child('things'); var things = $firebaseArray(thingsRef); $scope.things = things; // Add thing $scope.addThing = function(thing) { var d = new Date(); var newThing = { name: thing.name, description: thing.description, createdAt: d.toISOString(), updatedAt: d.toISOString() }; things.$add(newThing); }; // Update thing var serviceId = $routeParams.serviceId; if(serviceId) { $scope.selectedThing = getThing(serviceId); } function getThing(serviceId) { return $firebaseObject(ref.child('things').child(serviceId)); } $scope.updateThing = function(thing) { var d = new Date(); var editedThing = { name: thing.name, description: thing.description, updatedAt: d.toISOString() } $scope.selectedThing.$save(editedThing); }; name,则会在Firebase中更新这些值。但是在更新时,不会生成新的时间戳,也不会将其推送到Firebase。

知道我做错了什么吗?任何帮助表示赞赏。提前谢谢!

2 个答案:

答案 0 :(得分:2)

利用内置的$extend功能,您可以在保存期间添加时间戳,而不用大惊小怪。

app.factory('SyncWithTimestamp', function($firebaseObject) {
   return $firebaseObject.$extend({
      toJSON: function() {
         return {
            name: this.name,
            description: this.description,
            createdAt: this.createdAt,
            // when data is returned to the server, set the updatedAt
            // to a new, server-generated timestamp (to avoid client discrepancies)
            updatedAt: Firebase.ServerValue.TIMESTAMP
         }
      }
   });
});

现在您只需要正常使用扩展工厂:

app.controller(..., function(SyncWithTimestamp) {

   $scope.selectedThing = new SyncWithTimestamp(thingsRef.child(serviceId));

});

updateThing()方法是多余的,可能会产生错误。无需从同步对象中复制数据,然后尝试将其保存回同步对象(无论如何都不会将args传递给$save())。你可以使用它:

<form ng-submit="selectedThing.$save()">

所有这一切,以及the guide中的示例剪辑涵盖了AngularFire的更多基础知识。它将为您节省一些挫折和痛苦,以便详细介绍。

答案 1 :(得分:0)

这不是$ save()的工作方式,它不需要任何参数,你必须改变de original $ scope然后调用$ save()。

你可以尝试:

$scope.updateThing = function(thing) {
var d = new Date();
  $scope.selectedThing.name = thing.name;
  $scope.selectedThing.description = thing.description;
  $scope.selectedThing.date = d.toISOString()

  $scope.selectedThing.$save();
};