我正在学习使用angular的Firebase教程,它开始于在控制器中制作child_added
请求,但现在我们正在重构并将这些请求移动到服务中——正如我们应该的那样。
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()
方法联系在一起?
我将非常感谢任何解释。谢谢!
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
对象。