2014-12-05 52 views
2

我是AngularJS的新手,並試圖將其與AngularFire/Firebase結合使用以存儲一些項目數據。我建立了一個應該處理通知的工廠,以便在中央位置顯示它們。工廠看起來是這樣的:用AngularFire創建用戶並致電工廠以顯示通知

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); 
    } 
    }; 
}); 

控制器綁定數據我用$看

$scope.$watch(function() { return AlertService.alerts; }, function (alerts) { 
    $scope.alerts = AlertService.alerts; 
}); 

,只是放在一個div中的index.html:

<div id="alert"> 
    <alert ng-repeat="alert in alerts" type="{{alert.type}}">{{alert.msg}}</alert> 
</div> 

這是如果我在控制器中調用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"); 
    } 
}); 

任何想法,我(愚蠢)做錯了什麼?提前致謝!

編輯:這裏的Plnkr http://plnkr.co/edit/jSaJ5EzZ5MGRPFzhbGJg?p=preview

+0

你可以在Plunkr或JSBIN中重現這個嗎? – 2014-12-05 11:41:30

+0

感謝您的快速回復。這裏的Plunkr:http://plnkr.co/edit/jSaJ5EzZ5MGRPFzhbGJg?p=preview「點擊添加警報」正在工作。如果您選擇「在回撥中添加警報」,則console.log()操作正在運行,但不會顯示通知。如果您多次單擊「添加警報回叫」按鈕,則會顯示一些通知 – andinho 2014-12-05 12:57:18

回答

5

您只使用火力地堡JavaScript庫,而不是AngularFire。 AngularFire建立在Firebase JS庫和Angular之上。 AngularFire做了很多有用的事情,例如,自動同步objectsarrays(您可能想檢查一下數組示例)。 AngularFire也正確處理$scope.apply。這樣任何更新都應用於視圖。

如果您選擇不使用AngularFire,則需要包裝代碼中用於更新$timeout服務中視圖的部分。

Plunker

$scope.createUser = function(){ 
    ref.createUser({ 
     email : "[email protected]om", 
     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"); 
      } 
     }); 

     }); 
    } 

我強烈推薦給AngularFire文檔很好看。它會爲您節省相當數量的時間在您的項目中。

+0

Works!謝謝!此時我沒有使用AngularFire,因爲我不想將通知存儲在數據庫中。但隨着用戶處理下一步,我很可能會回到你的其他鏈接;)再次感謝! – andinho 2014-12-05 14:28:23

+0

@andinho,您的評論在這裏沒有任何意義。您在上面調用push(),但聲明您不希望將數據存儲在「DB」(Firebase不是數據庫,它是實時持久層)。 AngularFire不關於用戶處理。這是一個實時綁定,可將Firebase數據與Angular的視圖進行同步,並且非常適合您的上述要求。此外,大衛的答案是現貨。 – Kato 2014-12-19 18:55:44