我有一个带firebase的简单应用程序。对于firebase数据库,我保存了一些数据,保存后我想向用户显示警告窗口,响应为" everythig很棒"或者"坏"。对于警报窗口我使用ui-bootstrap。警报我使用$ rootScope。所以当我保存一些数据时,我有回调:
person.child(someName)
.set(personData)
.then(function () {
$rootScope.alert = {type:'success', msg:'Person is added!'};
$rootScope.showAlert = true;
console.log($rootScope.showAlert, $rootScope.alert);
})
.catch(function (e) {
$rootScope.alert = {type:'danger', msg:e};
$rootScope.showAlert = true;
});
html是:
<div uib-alert
ng-class="'alert-' + (alert.type || 'warning')"
dismiss-on-timeout="2000"
ng-if="showAlert"
close="close()">{{alert.msg}}
</div>
<button ng-click='press()'>Press</button>
和控制器调用工厂:
$scope.press = function() {
fact.setItem({name: 'Josh', age: 20, sex: 'male'});
}
在控制台中我看到rootScope是alert和showAlert的设置值,但是警报不起作用,所以我在html页面中绑定了这个2值,我看到我第一次按下按钮不起作用,但第二个工作正常等等In jsbin example I make this situation。在这种情况下我哪里错了?
答案 0 :(得分:1)
由于firebase是角度的第三方,$rootScope
未被应用。
因此,您必须手动应用app.factory('fact', ['$firebaseArray', '$rootScope', function($firebaseArray, $rootScope) {
var person = firebase.database().ref().child('evil_genius');
return {
setItem : function(personData) {
var someName = Math.random().toString(36).substring(7);
return person.child(someName)
.set(personData)
.then(function () {
$rootScope.alert = {type:'success', msg:'Person is added!'};
$rootScope.showAlert = true;
$rootScope.$apply();
console.log($rootScope.showAlert, $rootScope.alert);
})
.catch(function (e) {
$rootScope.alert = {type:'danger', msg:e};
$rootScope.showAlert = true;
});
}
}
}])
才能使其正常运行。
HEre是解决您问题的唯一方法。我会尽快找到另一种解决方案。
尝试将工厂设为,
{{1}}
答案 1 :(得分:1)
试试这个:
.then(function () {
$rootScope.alert = {type:'success', msg:'Person is added!'};
$rootScope.showAlert = true;
$rootScope.$apply();
})
.catch(function (e) {
$rootScope.alert = {type:'danger', msg:e};
$rootScope.showAlert = true;
$rootScope.$apply();
});