【问题标题】:AngularFire 0.8 bindTo only works for first changeAngularFire 0.8 bindTo 仅适用于第一次更改
【发布时间】:2014-07-31 21:57:11
【问题描述】:

您好,我一直在尝试使用新的 angularfire 版本 0.8 创建一个应用程序,该版本具有 $bind 的更新版本 $bindTo。但是我有一点困难。绑定到方法似乎仅在第一次更新时将更改传播回 firebase。页面上数据的后续更改不会。我需要在每次更新时重新绑定对象吗?

我创建了一个简单的应用程序来显示问题。该应用程序有一个在工厂(测试)中创建的对象,该对象将一个对象添加到 $rootScope。然后控制器访问它,视图访问它并根据需要进行更新。

工厂(services/test.js)

app.factory('Test',function($firebase, FIREBASE_URL, $rootScope) {
    var URL = FIREBASE_URL + 'test12/';
    var Test = {
        create: function (user,obj) {
            console.log("Creating new test object");
            obj.something = "1234";
            obj.somethingElse = "567";
            obj.$priority="7";
            obj.$save();
            setCurrentTest(user);
        },
        getCurrent: function() {
            return $rootScope.currentTest;
        }
    };

    function setCurrentTest(user) {
        var obj = $firebase(new Firebase(URL)).$asObject();

        obj.$loaded().then(function() {
            if (obj.$priority) {
                obj.$bindTo($rootScope,'currentTest').then(function() {
                    console.log("bound");
                });
            }
            else {
                Test.create(user,obj);
            }
        });
    }

    $rootScope.$on('$firebaseSimpleLogin:login', function(e, user) {
        setCurrentTest(user);
    });

    return Test;
});

控制器(controller/test.js)

app.controller('TestCtrl', function($scope,  Test) {
    $scope.testy = Test.getCurrent();
});

查看 (test.html)

<div class="t_center">
    <h3>Testing</h3>
        <div>
            <input type="test" name="test1" value="testy.something" ng-model="testy.something"/>
            <input type="test" name="test2" ng-model="testy.somethingElse"/>
        </div>
    <br/>
</div>

我正在使用;

  • 角度#1.2.21
  • firebase#1.0.18
  • firebase-simple-login#1.6.2

非常感谢任何建议。

背景 我认为我的示例代码并没有很好地突出我想要实现的目标,所以我将提供一些我想要做的事情的背景。我在这里创建的对象(在此处的示例中称为“测试”)实际上基本上是一个用户配置文件。在通常的用户类型事物(名称等)中,它还包含一些由所有控制器使用的首选项。我不想复制该代码,而是想创建一个服务,该服务在登录时获取用户配置文件并将其放置在 $rootScope 中,以供任何控制器需要它使用。如果服务在系统中找不到配置文件,则会创建它(使用合理的值)。

【问题讨论】:

  • 您使用的是 Angular 1.2.18+ 吗? firebase.com/docs/web/bindings/angular/…
  • 唉(我希望有这么简单的东西:))。我已经编辑了帖子以包含我正在运行的版本。
  • 这里的用例很难理解。为什么每次登录状态更改或任何时候 $priority 设置为 null 时都会绑定一个新的 $firebase 对象?为什么旧对象未绑定?为什么不继续绑定到同一个对象呢?您能否将其简化为仍然重现错误的最小示例?似乎有很多不必要的活动部件。
  • 首先感谢您在此问题上回到我身边——对于 Angular 和 Firebase 来说都是新手。啊,我可能应该更好地解释用例,我使用 $rootScope 而不是 $scope 是故意的。虽然我很高兴看到我的方式的错误。我会为这个问题添加一点背景,看看你是否能看到是什么让我发疯:)

标签: angularjs firebase angularfire


【解决方案1】:

由于这似乎是对 $rootScope 的严重盗用,因此解决问题似乎比了解您的示例有什么问题更简单。 Here's a working example 带有服务和 $bindTo。

var app = angular.module("sampleApp", ["firebase"]);

app.constant('FIREBASE_URL', 'https://kato-so25069621.firebaseio-demo.com/');

app.factory('Test',function($firebase, FIREBASE_URL) {
    return function(path) {
        var URL = FIREBASE_URL + path;
        var obj = $firebase(new Firebase(URL)).$asObject();
        obj.$loaded(function() {
            console.log('loaded', obj);
            if( obj.$value === null ) { // if object has not been initialized
                angular.extend(obj, {
                    something: "1234", 
                    somethingElse: "567",
                    $priority: 7
                });
                obj.$save();
            }
        });
        return obj;
    }
});

app.controller('TestCtrl', function($scope,  Test) {
    Test('test12/').$bindTo($scope, 'testy');
});

注意这些重要原则:

  • 服务不再绑定到 $rootScope
  • 我们将 $bindTo 与当前 $scope 一起使用,因此当它被销毁时,它会自动解除绑定
  • 我们不担心服务内部的身份验证,但假设用户已经通过身份验证,请参阅下文

这里唯一缺少的组件是身份验证,这是故意遗漏的。这不应该在每个服务和控制器中检查(相反,请查看指南中Authentication 下的Using Simple Login with Routers

【讨论】:

  • 我注意到您使用了 (obj.$value == null),我试图使用对象的 $priority 来执行此操作。我不确定未找到什么受支持的对象。这更有意义。
  • 我在您的示例上花费了更长的时间,我可以看到它与我尝试做的事情有何不同,这很有意义。我想我掉进兔子洞的地方是试图找到与当前用户相关的对象。我的控制器似乎总是在用户对象被实例化(简单登录)之前运行,所以我尝试使用登录回调。我想我会在身份验证文档上多花一点时间,看看能不能弄明白。
  • 请尝试使用路由器简单登录的示例。如果您有问题,请 ping 支持或邮件列表(或添加新的 SO 问题)。我们会帮你解决的。
猜你喜欢
  • 2023-03-08
  • 1970-01-01
  • 2021-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
  • 1970-01-01
相关资源
最近更新 更多