我正在使用教程中的Firebase聊天,我添加了一个额外的密钥对,它将以布尔形式跟踪每条消息的“状态”:
myDataRef.push({
name: name,
text: text,
status: false
});
这是fiddle。
我希望在更改数据库中status的值时自动更改文本。因此,如果我将一条消息更改为false,则该消息将变为红色而不是默认的绿色。
以下是我遇到问题的一点:
var done = myDataRef.orderByChild('status').equalTo(true);
done.on('child_added', function(function(snapshot) {
var obj = snapshot.val();
if(obj.status == true) {
$('.text').attr('class', 'text red');
}
});
代码首先遍历所有孩子,寻找那些孩子“status”等于true的孩子。然后通过将文本变为红色来更改结果的属性。
但是,我不确定为什么,但我得到了:
Uncaught SyntaxError: Unexpected token function
我希望有人可以帮助我!感谢。
答案 0 :(得分:3)
上面的示例中有一个拼写错误:
done.on('child_added', function(function(snapshot) { ... })
。
请注意,重复function
。相反,这应该是:
done.on('child_added', function(snapshot) { ... })
。
-
更新2015-03-17 :
在your JSFiddle中,有一些错误。首先,您默认使用“绿色”创建元素:
function displayChatMessage(name, text) {
$('#messagesDiv').prepend('<div class="text green"><i>' + name + '</i> ' + text + '<br>');
};
但是,您没有关闭<div>
代码,并且您过滤掉了obj.status
为假的任何情况,因此应该更新为红色:
var done = myDataRef.orderByChild('status').equalTo(true);
done.on('child_added', function(snapshot) {
var obj = snapshot.val();
if(obj.status == true) { <-- Should be 'obj.status == false'
$('.text').attr('class', 'text red');
}
});
下一个问题是,在换色时,您没有选择任何特定的子元素 - 您正在选择带有text
类的所有字段:
var done = myDataRef.orderByChild('status').equalTo(true);
done.on('child_added', function(snapshot) {
var obj = snapshot.val();
if(obj.status == true) {
$('.text').attr('class', 'text red'); <-- Offending line
}
});
您需要为列表中的每个元素指定一些标识符,以便稍后在状态更改时可以专门更新该元素。这是一个更新版本,您可以在位于here的JSFiddle中测试:
myDataRef.on('child_added', function(snapshot) {
var message = snapshot.val();
var color = (message.status) ? 'green' : 'red';
$('#messagesDiv').prepend(
$('<div />', {
'id' : message.name,
'class' : 'text ' + color,
'html' : '<i>' + message.name + '</i> ' + message.text + '<br>'
})
);
});
myDataRef.on('child_changed', function(snapshot) {
var message = snapshot.val();
var color = (message.status) ? 'green' : 'red';
$('#' + snapshot.key()).attr('class', 'text ' + color);
});