我遇到了一些奇怪的竞争条件和不必要的“设置”命令被解雇并开始调查。我没有破译AngularFire的所有内部方法,因为绑定导致手表被设置。但是,Firebase中存储的对象似乎存在一个错误,该错误先前已在其上设置了优先级。
AngularFire的监视功能比较运算符永远不会匹配,因此会强制写入一组。这是因为以下代码在“本地”副本上运行:
// Parse a local model, removing all properties beginning with "$" and
// converting $priority to ".priority".
_parseObject: function(obj) {
function _findReplacePriority(item) {
for (var prop in item) {
if (item.hasOwnProperty(prop)) {
if (prop == "$priority") {
item[".priority"] = item.$priority;
delete item.$priority;
} else if (typeof item[prop] == "object") {
_findReplacePriority(item[prop]);
}
}
}
return item;
}
这导致angular.equals与ALWAYS的比较失败,因为AngularFire监视函数中使用的相等性测试(作为$ bind的结果)如下:
// We're responsible for setting up scope.$watch to reflect local changes
// on the Firebase data.
var unbind = scope.$watch(name, function() {
// If the new local value matches the current remote value, we don't
// trigger a remote update.
var local = self._parseObject(self._parse(name)(scope));
if (self._object.$value &&
angular.equals(local, self._object.$value)) {
return;
} else if (**angular.equals(local, self._object)**) {
return;
我已经加了问题代码。对于具有预先存在的优先级的对象,这将始终评估为false,因为self._object将具有“$ priority”,而本地将具有“.priority”。
我认为代码应该是:
} else if (angular.equals(local, self._parseObject(self._object))) {
我将添加解决此问题的代码,但希望Firebase小组确认错误。很难理解没有人遇到过这个。此外,还没有完全清楚AngularFire代码中将$ priority转换为.priority的目的。所以让我质疑我的分析。
-E
答案 0 :(得分:0)
错误确认并完成了拉取请求。所以我会回答我自己的问题。