您好我一直在尝试使用新的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>
我目前正在使用;
任何建议都非常感谢。
背景 我不认为我的示例代码强调了我想要实现的目标,所以我将提供一些我想要做的背景。我在这里创建的对象(在此示例中称为&#34; Test&#34;实际上基本上是用户配置文件)。在通常的使用类型的东西(名称等)中,它还包含所有控制器使用的一些偏好。我没有复制那些代码,而是想创建一个服务,该服务在登录时获得了用户配置文件,并将其放在$ rootScope中,以便为任何需要它的控制器做好准备。如果服务无法在系统中找到配置文件,则会创建它(具有合理的值)。
答案 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');
});
请注意以下重要原则:
此处缺少的唯一组件是身份验证,故意被遗漏。不应在每个服务和控制器中检查这一点(而是在指南中的Authentication下查看使用路由器的简单登录。