我设置了一个编辑一个字段的小样本应用程序.但是当我输入该字段时,内容会一直恢复到一秒钟之前.我正在寻找AngularFire的修复程序,它可以使它正常工作,或者我正在寻找一个我没有正确初始化它的RTFM.此时bindTo()不可用,我根本无法继续使用AngularFire.
这是完整的示例(您可以在http://jsbin.com/wabafu/3上打开它):
Enable Editing
{{data.SyncValue}}
它只在一个浏览器中打开时工作顺畅,但是当打开多个时,我不能输入多于一个字或两个字而没有文本内容恢复到几个键击前并且光标移动到字段的末尾.
我想发生的事件是:
我输入,值在angularjs(GOOD)中更新
Angularfire将新值发送到firebase(GOOD)
Firebase将值发送给其他浏览器(我继续输入时)(好)
其他浏览器收到新值并更新其html(GOOD)
其他浏览器将值重新发送回firebase,就像它是新信息一样(真的很糟糕)
Firebase接收到这个回显过时的值并将其推回给我(BAD)
我的浏览器获得了这个第二旧的值,因为它与我文本字段中的内容不同,我的fiedl的内容被恢复(BAD)
我想这个过程是错的吗?我该怎么做才能停止第5步?
PS测试时,我发现我可以通过快速键入几个字符然后等待2秒重复来解决#7问题.这样,当同步回显并且我的光标不会跳转时,该值不会改变.
PPS为了尝试缩小范围,我创建了一个复选框来控制数据是显示在字段中,还是只显示只读div.即使第二个浏览器仅显示数据,该回显/恢复行为仍然存在于第一个浏览器中.数据正确存储在firebase中的唯一方法是,如果我一次只有一个浏览器使用它.
通过在输入上添加去抖,我获得了很好的成功.
<input type="text" ng-model="data.field" ng-model-options="{ updateOn: 'default blur', debounce: {'default': 500, 'blur': 0} }" />
此外,$ bindTo在这里并不是绝对必要的.手动保存数据并跳过$ bindTo并不是特别困难.
$scope.data = $firebase(new Firebase(...)).$asObject(); <input type="text" ng-model="data.field" ng-blur="data.$save()" />