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()。