angular 0.8的bindTo只在第一次修改时有效



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

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

工厂(服务/. 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/. 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
  • firebase-simple-login # 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
  • 我们使用$bindTo和当前的$作用域,所以当它被销毁时,它会自动解除绑定
  • 我们不担心我们的服务内部的身份验证,但假设用户已经经过身份验证,详见

这里唯一缺少的组件是身份验证,这是有意忽略的。不应该在每个服务和控制器中都检查这个(相反,请检查指南中Authentication下的Using Simple Login with路由器)。

相关内容

  • 没有找到相关文章

最新更新