我正在尝试使用angularjs和Firebase构建一个类似于帮助我的同学解决问题的论坛。我还希望人们能够“回复”同学们遇到的具体问题,所以我在angularjs工厂中创建了一个具有许多值的对象,如下所示:
factory.addError = function() {
factory.errors.$add({
...
replies: []
});
};
问题在于Firebase不保存占位符空值的参数,例如上面的参数“回复”。我曾尝试将占位符值硬编码到数组中,但这似乎是一个非常不完整的解决方案,而且我自己必须删除Firebase中的数据时遇到了一系列问题。作为参考,这是链接控制器中的代码:
$scope.error.replies.$push({
name: $scope.replyName,
message: $scope.replyMessage,
time: (new Date()).toString(),
upvote: 0
});
如何将空数组初始化为对象? $ push会正确使用Firebase的命令将其保存到自己的数据集中吗?
答案 0 :(得分:3)
首先,这里有一些相关的资源和建议:
正如AngularFire API Documentation所说:
"有几种强大的技术可以转换
$firebaseArray
和$firebaseObject
下载和保存的数据。这些技术只能由熟悉代码的高级Angular用户尝试。"
把所有这些放在一起,你完成了你想做的事情:
$firebaseArray
和$firebaseObject
。$firebaseObject
.factory('Error', function(fbUrl, ErrorFactory) {
return function(errorKey){
var errorRef;
if(errorKey){
// Get/set Error by key
errorRef = new Firebase(fbUrl + '/errors/'+errorKey);
} else {
// Create a new Error
var errorsListRef = new Firebase(fbUrl + '/errors');
errorRef = errorsListRef.push();
}
return new ErrorFactory(errorRef);
}
})
.factory('ErrorFactory', function($firebaseObject){
return $firebaseObject.$extend({
sendReply: function(replyObject) {
if(replyObject.message.isNotEmpty()) {
this.$ref().child('replies').push(replyObject);
} else {
alert("You need to enter a message.");
}
}
});
})
.controller('ErrorController',function($scope, Error) {
// Set empty reply message
$scope.replyMessage = '';
// Create a new Error $firebaseObject
var error = new Error();
$scope.error = error;
// Send reply to error
$scope.reply = function(){
error.sendReply({message:$scope.replyMessage});
}
})
String.prototype.isNotEmpty()
String.prototype.isNotEmpty = function() {
return (this.length !== 0 && this.trim());
};
(改编自this answer)