AngularFire:如何在不同步到 Firebase 的情况下更新范围(即本地状态,如 "loading" 或 "selected")
AngularFire: How to update scope without syncing to Firebase (i.e. local states, like "loading" or "selected")
我是 Firebase 和 AngularJS(以及 AngularFire)的新手,但我设法解决了大部分问题......然而这个让我很困惑。
情况:
我有一个服务器和一个单独的前端。前端没有 Firebase 的写入权限——它只能读取自己的数据(使用服务器提供的令牌)。服务器有一个 API 前端用来进行更新。
对于请求更新列表中特定项目的前端,它需要向服务器提供该项目的 Firebase ID(以及 API 需要的任何其他信息)。服务器将首先验证该 ID,然后使用它来更新正确的 Firebase 数据。
我让 AngularFire 为这些操作做了三向数据绑定,太棒了!
问题:
假设我的 Firebase 结构如下:
actions: {
-JFeuuEIFDh: { // Firebase IDs for arrays
label: "One",
.
.
.
},
-JfuDu2JC81: {
"label": "Two",
.
.
.
}
我有以下 HTML:
<div ng-controller"SuperController">
<ul>
<!-- key is the Firebase ID for the action, which is
required for my server to know which object to update -->
<li ng-repeat="(key, action) in actions">
<a ng-click="doAction(key, action)">action.label</a>
<!-- **Loading IS NOT and SHOULD NOT be stored in Firebase,**
it's simply a local state which AngularJS should manage -->
<p ng-hide="!action.loading">Loading...</p>
</li>
</ul>
</div>
doAction 看起来像这样:
$scope.doAction = function(key, item) {
$scope.actions[key].loading = true;
var onComplete = function () {
$scope.actions[key].loading = false;
}
// Calls to the server, etc...
.
.
.
}
我正在使用 $scope.actions[key].loading
来提供 本地状态 因此 "Loading..." 段落将在用户启动 doAction
时出现,并且当 doAction
逻辑完成时消失。
但是,由于 AngularFire 设置了三向数据绑定,它试图将更改保存到数据库,但失败了,因为客户端没有写入权限!
我不希望它保存加载到数据库!它只是为了更新该段落的 ng-hide
- 它不应该是持久的,并且没有办法证明向客户端提供写权限是合理的。
那我该怎么办?我想不出有什么方法可以在不触发三向绑定的情况下更新作用域...我是不是想错了?
编辑
嵌套在 AngularJS documentation, under $FirebaseObject.$bindTo 的深处,是这样的:
use a variable prefixed with _
, which will not be saved to the server, but will trigger $watch()
.
但是当我改用$scope.actions[key]._loading
时,还是出现了同样的问题。没有明显区别。
我找不到问题的干净解决方案。
use a variable prefixed with _
, which will not be saved to the server, but will trigger $watch()
.
这实际上并没有在代码中实现。我正在考虑自己提交一个实现,但它并不像我希望的那么简单。即使在 toJSON 停止返回 _'d 变量之后,它仍然试图将(未更改的)JSON 保存到 Firebase,所以你必须以某种方式更早地修复它......我没有去那里。
为了解决这个问题,我使用了 AngularFire 的 $asArray 而不是 $asObject。该数组是只读的。 Firebase 不会尝试同步任何更改,除非您调用特殊函数。就我而言,这可行,但在其他情况下可能还不够。
我不得不稍微更改我的模板以使用数组而不是对象,因为现在提供的是数字键而不是 Firebase 中使用的实际键。我将数字键转换为正确的键:actions.$keyAt(parseInt(key))
.
一团糟..但现在它会让我度过难关。
我遇到了同样的问题。但这似乎解决了它。
https://www.firebase.com/docs/web/libraries/angular/api.html#angularfire-firebaseobject-bindtoscope-varname
If $destroy() is emitted by scope (this happens when a controller is > destroyed), then this object is automatically unbound from scope. It can > also be manually unbound using the unbind() method, which is passed into ? > the promise callback.
//照常设置同步数组
$scope.syncedArray = $firebaseArray(ref);
//在变量上调用解除绑定
$scope.syncedArray.unbind();
//像往常一样重新排序、过滤和操作数组,完成后调用 .bind()。
我是 Firebase 和 AngularJS(以及 AngularFire)的新手,但我设法解决了大部分问题......然而这个让我很困惑。
情况:
我有一个服务器和一个单独的前端。前端没有 Firebase 的写入权限——它只能读取自己的数据(使用服务器提供的令牌)。服务器有一个 API 前端用来进行更新。
对于请求更新列表中特定项目的前端,它需要向服务器提供该项目的 Firebase ID(以及 API 需要的任何其他信息)。服务器将首先验证该 ID,然后使用它来更新正确的 Firebase 数据。
我让 AngularFire 为这些操作做了三向数据绑定,太棒了!
问题:
假设我的 Firebase 结构如下:
actions: {
-JFeuuEIFDh: { // Firebase IDs for arrays
label: "One",
.
.
.
},
-JfuDu2JC81: {
"label": "Two",
.
.
.
}
我有以下 HTML:
<div ng-controller"SuperController">
<ul>
<!-- key is the Firebase ID for the action, which is
required for my server to know which object to update -->
<li ng-repeat="(key, action) in actions">
<a ng-click="doAction(key, action)">action.label</a>
<!-- **Loading IS NOT and SHOULD NOT be stored in Firebase,**
it's simply a local state which AngularJS should manage -->
<p ng-hide="!action.loading">Loading...</p>
</li>
</ul>
</div>
doAction 看起来像这样:
$scope.doAction = function(key, item) {
$scope.actions[key].loading = true;
var onComplete = function () {
$scope.actions[key].loading = false;
}
// Calls to the server, etc...
.
.
.
}
我正在使用 $scope.actions[key].loading
来提供 本地状态 因此 "Loading..." 段落将在用户启动 doAction
时出现,并且当 doAction
逻辑完成时消失。
但是,由于 AngularFire 设置了三向数据绑定,它试图将更改保存到数据库,但失败了,因为客户端没有写入权限!
我不希望它保存加载到数据库!它只是为了更新该段落的 ng-hide
- 它不应该是持久的,并且没有办法证明向客户端提供写权限是合理的。
那我该怎么办?我想不出有什么方法可以在不触发三向绑定的情况下更新作用域...我是不是想错了?
编辑
嵌套在 AngularJS documentation, under $FirebaseObject.$bindTo 的深处,是这样的:
use a variable prefixed with
_
, which will not be saved to the server, but will trigger$watch()
.
但是当我改用$scope.actions[key]._loading
时,还是出现了同样的问题。没有明显区别。
我找不到问题的干净解决方案。
use a variable prefixed with
_
, which will not be saved to the server, but will trigger$watch()
.
这实际上并没有在代码中实现。我正在考虑自己提交一个实现,但它并不像我希望的那么简单。即使在 toJSON 停止返回 _'d 变量之后,它仍然试图将(未更改的)JSON 保存到 Firebase,所以你必须以某种方式更早地修复它......我没有去那里。
为了解决这个问题,我使用了 AngularFire 的 $asArray 而不是 $asObject。该数组是只读的。 Firebase 不会尝试同步任何更改,除非您调用特殊函数。就我而言,这可行,但在其他情况下可能还不够。
我不得不稍微更改我的模板以使用数组而不是对象,因为现在提供的是数字键而不是 Firebase 中使用的实际键。我将数字键转换为正确的键:actions.$keyAt(parseInt(key))
.
一团糟..但现在它会让我度过难关。
我遇到了同样的问题。但这似乎解决了它。 https://www.firebase.com/docs/web/libraries/angular/api.html#angularfire-firebaseobject-bindtoscope-varname
If $destroy() is emitted by scope (this happens when a controller is > destroyed), then this object is automatically unbound from scope. It can > also be manually unbound using the unbind() method, which is passed into ? > the promise callback.
//照常设置同步数组
$scope.syncedArray = $firebaseArray(ref);
//在变量上调用解除绑定
$scope.syncedArray.unbind();
//像往常一样重新排序、过滤和操作数组,完成后调用 .bind()。