使用AngularFire创建用户并调用factory来显示通知

and*_*nho 2 javascript angularjs firebase angularfire angular-promise

我是AngularJS的新手,并试图将它与AngularFire/Firebase结合使用来存储一些项目数据.我建立了一个工厂,应该处理通知,以便在中心位置显示它们.工厂看起来像这样:

myApp.factory("AlertService", function($timeout){
  var alerts = new Array();

  var addAlert = function(type, message){
    alerts.push({
      type: type,
      msg: message
    });
    $timeout(function(){
      removeAlert(alerts.length - 1);
    }, 3000);
  }

  var removeAlert = function(index){
    alerts.splice(index, 1);
  }

  return{
    alerts : alerts,
    addSuccessAlert : function(message){
      addAlert("success", message);
    },
    addDangerAlert : function(message){
      addAlert("danger", message);
    },
    deleteAlert : function(index){
      removeAlert(index);
    }
  };
});
Run Code Online (Sandbox Code Playgroud)

绑定控制器中的数据我用$ watch

$scope.$watch( function () { return AlertService.alerts; }, function ( alerts ) {
  $scope.alerts = AlertService.alerts;
});
Run Code Online (Sandbox Code Playgroud)

并在index.html中放置了一个div:

<div id="alert">
  <alert ng-repeat="alert in alerts" type="{{alert.type}}">{{alert.msg}}</alert>
</div>
Run Code Online (Sandbox Code Playgroud)

如果我AlertService.addWarningAlert("Your password is not identical");在控制器内打电话,这完全有效.但是,如果我现在尝试在firebase中创建用户后显示通知,则数据绑定不会更新(仅限数组).多数民众赞成我如何创建用户:

var ref = new Firebase("https://xyz.firebaseio.com/"); 
ref.createUser({
  email    : $scope.data.suEmail,
  password : $scope.data.suPassword
}, function(error) {
  if (error === null) {
    console.log("User created successfully");
    AlertService.addSuccessAlert("User created successfully");
  } else {
    console.log("Error creating user:", error);
    AlertService.addWarningAlert("Error creating user");
  }
});
Run Code Online (Sandbox Code Playgroud)

知道我(愚蠢地)做错了吗?提前致谢!

编辑:这里是Plnkr http://plnkr.co/edit/jSaJ5EzZ5MGRPFzhbGJg?p=preview

Dav*_*ast 5

您只使用Firebase JavaScript库而不是AngularFire.AngularFire构建于Firebase JS库和Angular之上.AngularFire做了很多有用的事情,比如自动同步对象数组(你可能想要为你的数组示例检查一下).AngularFire也能$scope.apply正确处理.这样,任何更新都将应用于视图.

如果您选择不使用AngularFire,则需要包含更新$timeout服务中视图的代码部分.

Plunker

  $scope.createUser = function(){
    ref.createUser({
        email    : "a.b@c.com",
        password : "mypassword"
      }, function(error) {

        // this will update the view because it's wrapped in $timeout
        $timeout(function() {
          if (error === null) {
            console.log("User created successfully");
            AlertService.addSuccessAlert("User created successfully");
          } else {
            console.log("Error creating user:", error);
            AlertService.addWarningAlert("Error while creating user");
          }
        });

      });
  }
Run Code Online (Sandbox Code Playgroud)

我强烈建议给AngularFire文档一个很好的阅读.它将为您节省大量的项目时间.