你好,我一直在尝试使用新的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路由器)。