我正在使用angular进行Firebase教程,它首先在控制器中发出child_added
个请求,但现在我们正在重构并将这些请求移动到服务中 - 正如我们应该的那样。
但是,我不熟悉的服务中使用了一些语法。这是我的服务,它向firebase db发出child_added
请求:
app.service(‘messageService’, function() {
var messagesRef = new Firebase(FBURL);
return {
childAdded: function childAdded(callback) {
messagesRef.on(‘child_added’, function(data) {
callback.call(this, {
user: data.val().user,
text: data.val().text,
name: data.name()
});
});
}
}
}
然后在控制器中我们正在使用这样的服务:
messageService.childAdded(function(addedChild) {
$timeout(function() {
$scope.messages.push(addedChild);
});
});
首先,我对callback.call(this, ...
正在做什么感到困惑?其次,该行如何与控制器中的push()
方法相结合?
我非常感谢任何解释。谢谢!
答案 0 :(得分:3)
call()
只是JavaScript标准库中的一个函数(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call)。
您的代码:
callback.call(this, {
user: data.val().user,
text: data.val().text,
name: data.name()
});
几乎与说法相同:
callback({
user: data.val().user,
text: data.val().text,
name: data.name()
});
function (addedChild) {...}
是你的回调。
因此,在您的代码中,addedChild最终只是:
{
user: data.val().user,
text: data.val().text,
name: data.name()
}
data
是添加的子项的DataSnapshot,data.val()
是其值,data.name()
是其关键字。
使用call()
与直接调用回调的唯一不同之处在于,调用允许您指定调用者,调用者成为回调的this
对象。 (很多电话*在最后一句话中继续)。