我正试图了解如何更新Firebase项目的updatedAt
时间戳。
更新的thing.name
和thing.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。
知道我做错了什么吗?任何帮助表示赞赏。提前谢谢!
答案 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();
};