回调中的$ rootScope无法正常工作

时间:2017-01-30 13:06:37

标签: angularjs firebase firebase-realtime-database angular-ui-bootstrap

我有一个带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。在这种情况下我哪里错了?

2 个答案:

答案 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}}

HERE IS A WORKING DEMO

答案 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();
});