Angularjs AngularFire 0.8 bindTo仅适用于第一次更改

Angularjs AngularFire 0.8 bindTo仅适用于第一次更改,angularjs,firebase,angularfire,Angularjs,Firebase,Angularfire,嗨,我一直在尝试使用新的angularfire版本0.8创建一个应用程序,它的更新版本为$bind,$bindTo。然而,我在这方面有点困难。bind to方法仅在第一次更新时将更改传播回firebase。对页面上数据的后续更改不适用。我是否需要在每次更新时重新绑定对象 我已经创建了一个简单的应用程序来显示这个问题。该应用程序在工厂(测试)中创建了一个对象,该工厂将一个对象添加到$rootScope。然后控制器访问它,视图访问它并根据需要进行更新 工厂(services/test.js) 控制器

嗨,我一直在尝试使用新的angularfire版本0.8创建一个应用程序,它的更新版本为$bind,$bindTo。然而,我在这方面有点困难。bind to方法仅在第一次更新时将更改传播回firebase。对页面上数据的后续更改不适用。我是否需要在每次更新时重新绑定对象

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

工厂(services/test.js)

控制器(Controller/test.js)

查看(test.html)


测试

即时通讯目前正在使用

  • 角度#1.2.21
  • firebase#1.0.18
  • firebase简单登录#1.6.2
非常感谢您的建议

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

由于这似乎是对$rootScope的严重挪用,因此解决问题似乎比理解示例的错误更简单。提供服务和$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
  • 我们在当前的$scope中使用$bindTo,所以当它被销毁时,它会自动解除绑定
  • 我们不担心服务内部的身份验证,但假设用户已经通过身份验证,请参阅下面的更多内容

这里唯一缺少的组件是身份验证,这是故意忽略的。这不应该在每个服务和控制器中都进行检查(相反,使用指南中路由器的简单登录进行检查。

您是否使用Angular 1.2.18+?唉,我是(我希望有这么简单的东西:))。我已经编辑了这篇文章以包含我正在运行的版本。在这里很难理解这个用例。为什么每次登录状态更改或$priority设置为null时都会绑定新的$firebase对象?为什么旧对象没有解除绑定?为什么不继续绑定到同一个对象呢?你能把它简化成一个最小的例子来重现错误吗?这里似乎有很多不必要的运动部件。首先,感谢您回到我这里,这对angular和firebase来说都是全新的。啊,我可能应该更好地解释一下这个用例,我使用$rootScope而不是$scope是有点刻意的。虽然我很高兴看到自己的错误。我将为这个问题添加一点背景知识,看看你是否能看出是什么让我发疯:)我注意到你使用了(obj.$value==null),这是我试图使用对象的$priority来完成的。我不确定找不到支持的对象。这更有意义。我花了更长的时间研究你的例子,我可以看出它与我试图做的有什么不同,这很有意义。我想我掉进兔子洞的地方是为了找到与当前用户相关的对象。我的控制器似乎总是在实例化用户对象之前运行(在简单登录中),所以我尝试使用登录回调。我想我会花一点时间在身份验证文档上,看看我是否能找到答案。请尝试使用路由器的简单登录示例。如果您有问题,请ping支持或邮件列表(或添加新的SO问题)。我们会安排你的。
app.controller('TestCtrl', function($scope,  Test) {
    $scope.testy = Test.getCurrent();
});
<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>
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');
});