【问题标题】:Updating scope variable when factory updates in AngularJS在AngularJS中更新工厂时更新范围变量
【发布时间】:2016-10-18 22:15:40
【问题描述】:

我是 AngularJS 的新手,目前在我的实时应用程序中使用 Google Firebase。我创建了一个工厂“Friends”,它使用以下代码实时检查我的 Firebase 数据库:

angular.module('App')

.factory('friendsFactory', function(){

   var friends = [];
   var friendshipRef = firebase.database().ref('friendships');

   friendshipRef.on('value', function(snapshot){

   //etc.. updates friends array

   });

   return{
      getFriends: function(){
        return friends;
      },
      //etc
   }

在我的控制器中,我将$scope.friends 变量设置为我的工厂类.getFriends() 方法。这很好用,我的页面正确显示所有朋友。

$scope.friends = friendsFactory.getFriends();

但是,一旦我的工厂更新,这些更改不会反映在我的范围变量和视图上。我尝试过使用$apply$watch 等,但我不知道如何确保我的范围和视图在出厂后立即更新。现在,每次我导航到不同的页面并返回时,才会显示更改。它们不会实时更新。谁能帮我完成这个?非常感谢!

【问题讨论】:

  • 您能说明如何更新friends 数组吗?
  • $watch 应该可以完美运行。你能展示你是如何在你的控制器中使用手表的吗?

标签: javascript angularjs ionic-framework firebase firebase-realtime-database


【解决方案1】:

您应该使用 angularfire 执行此操作,它在 firebase 数据库、模型和视图之间进行三向绑定。

1.在您的项目中包含angularfire

2.根据这个更新你的工厂,你不需要做任何事情。每当firebase数据库中friendships节点上的数据更新时,都会通知angularfire,angularfire会更新局部变量并调用$scope.$apply,因此视图也会更新。

// factory
angular.module('App', ['firebase'])

.factory('friendsFactory', function($firebaseArray){
   var friendshipRef = firebase.database().ref('friendships');

   return {
       friends: $firebaseArray(friendshipRef)
   }
});

// controller
$scope.friends = friendsFactory.friends;

【讨论】:

    【解决方案2】:

    因为,您在开始时只获得一次列表。

    $scope.$apply必须在on部分制作,但在工厂里做是不对的。

    尝试使用angularfire

    快速解决方案,可行:

    angular.module('App')
    .factory('friendsFactory', function(){
    
       var friends = [];
       var friendshipRef = firebase.database().ref('friendships');
    
       friendshipRef.on('value', function(snapshot){
           $timeout(function () {
               //etc.. updates friends array
           });
       });
    
       return{
          friends: friends,
          //etc
       }
    

    在控制器中:

    $scope.friends = friendsFactory.friends;
    

    【讨论】:

    • 我刚刚尝试了你的解决方案,但它目前实际上什么也没返回,$scope.friends 是空的
    • $scope.$apply必须在on部分做,但在工厂做是不对的。尝试使用这个:github.com/firebase/angularfire 用于角度方式。
    猜你喜欢
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 2014-01-24
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    相关资源
    最近更新 更多