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