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

时间:2014-07-31 21:57:11

标签: angularjs firebase angularfire

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

我创建了一个简单的应用来展示问题。该应用程序具有在工厂(Test)中创建的对象,该对象将对象添加到$ 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
  • 火力#1.0.18
  • 火力-简单登录#1.6.2

任何建议都非常感谢。

背景 我不认为我的示例代码强调了我想要实现的目标,所以我将提供一些我想要做的背景。我在这里创建的对象(在此示例中称为&#34; Test&#34;实际上基本上是用户配置文件)。在通常的使用类型的东西(名称等)中,它还包含所有控制器使用的一些偏好。我没有复制那些代码,而是想创建一个服务,该服务在登录时获得了用户配置文件,并将其放在$ rootScope中,以便为任何需要它的控制器做好准备。如果服务无法在系统中找到配置文件,则会创建它(具有合理的值)。

1 个答案:

答案 0 :(得分:3)

由于这似乎是对$ 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下查看使用路由器的简单登录