AngularFire 0.8 bindTo работает только для первого изменения

Привет! Я пытался создать приложение, используя новую версию 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
  • firebase # 1.0.18
  • firebase-простодушный Войти #1.6.2

Любой совет с благодарностью.

Исходная информация Я не думаю, что мой пример кода выделил то, что я пытался достичь очень хорошо, поэтому я предоставлю небольшую справку о том, что я пытался сделать. Объект, который я создаю здесь (называемый в этом примере "Test"), на самом деле является профилем пользователя. Среди вещей обычного типа (имя и т. Д.) Он также содержит некоторые предпочтения, которые используются всеми контроллерами. Вместо того, чтобы копировать этот код, я хотел создать службу, которая получит профиль пользователя при входе в систему и поместит его в $rootScope, готовый для любого контроллера, который ему требуется. Если сервис не может найти профиль в системе, он создает его (с разумными значениями).

1 ответ

Поскольку это выглядит как грубое незаконное присвоение $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 с текущей областью действия $, поэтому, когда она уничтожена, она автоматически связывается
  • мы не беспокоимся об аутентификации внутри нашего сервиса, но предполагаем, что пользователь уже аутентифицирован, подробнее см. ниже

Единственный компонент, отсутствующий здесь - это аутентификация, которая была намеренно пропущена. Это не должно быть проверено в каждой службе и контроллере (вместо этого, проверьте Использование простого входа в систему с маршрутизаторами в разделе Аутентификация в руководстве.

Другие вопросы по тегам