2015-11-28 21 views
1

我使用了一個教程來創建一個angularfire聊天應用程序。它是一個獨立的應用程序,使用ui路由器。我成功地將它作爲一個視圖集成在我的應用程序中,但這不切實際。我需要能夠在任何視圖上使用聊天。我被困在將解析功能移到控制器上。我已經閱讀了一些文檔,我相信它正在返回一個我需要在控制器中解決的承諾。這個教程的鏈接就在這裏。 tutorial如何使用angularfire檢索id的數據

這裏是我試圖從

.state('channels.direct', { 
       url: '/{uid}/messages/direct', 
       templateUrl: 'views/chat/_message.html', 
       controller: 'MessageController', 
       controllerAs: 'messageCtrl', 
       resolve: { 
        messages: function ($stateParams, MessageService, profile) { 
         return MessageService.forUsers($stateParams.uid, profile.$id).$loaded(); 
        }, 
        channelName: function ($stateParams, UserService) { 
         return UserService.all.$loaded().then(function() { 
          return '@' + UserService.getDisplayName($stateParams.uid); 
         }); 
        } 
       } 
      }) 

脫身消息服務

var channelMessagesRef = new Firebase(AppConstant.FirebaseUrl + 'channelMessages'); 
    var userMessagesRef = new Firebase(AppConstant.FirebaseUrl + 'userMessages') 

    return { 
     forChannel: function (channelId) { 
      return $firebaseArray(channelMessagesRef.child(channelId)); 
     }, 
     forUsers: function (uid1, uid2) { 
      var path = uid1 < uid2 ? uid1 + '/' + uid2 : uid2 + '/' + uid1; 

      return $firebaseArray(userMessagesRef.child(path)); 
     } 
    }; 

用戶服務

var usersRef = new Firebase(AppConstant.FirebaseUrl + 'users'); 
    var connectedRef = new Firebase(AppConstant.FirebaseUrl + '.info/connected'); 
    var users = $firebaseArray(usersRef); 
    return { 
     setOnline: function (uid) { 
      var connected = $firebaseObject(connectedRef); 
      var online = $firebaseArray(usersRef.child(uid + '/online')); 

      connected.$watch(function() { 
       if (connected.$value === true) { 
        online.$add(true).then(function (connectedRef) { 
         connectedRef.onDisconnect().remove(); 
        }); 
       } 
      }); 
     }, 
     getGravatar: function (uid) { 
      return '//www.gravatar.com/avatar/' + users.$getRecord(uid).emailHash; 
     }, 
     getProfile: function (uid) { 
      return $firebaseObject(usersRef.child(uid)); 
     }, 
     getDisplayName: function (uid) { 
      return users.$getRecord(uid).displayName; 
     }, 
     all: users 
    }; 

這裏的UI路由器就是我到目前爲止在控制器

$scope.directMessage = function (uid) { 
     UserService.all.$loaded().then(function() { 
      $scope.selectedChatUser = '@' + UserService.getDisplayName(uid); 
     }); 
     $scope.selectedChatUserMessages = MessageService.forUsers(uid, profile.$id).$loaded(); 
    }; 

我返回

$ scope.selectedChatUser

罰款。這個問題是與信息服務

這是什麼,我目前從消息服務

$$state: Object 
__proto__: Promise 

返回我如何解決這個問題?

回答

2

您試圖從channelName函數的承諾中返回。

你得到的對象是一個未解決的承諾。你希望將來自promise的解析數據注入到控制器中。

您需要創建一個從此函數返回。

.state('channels.direct', { 
    url: '/{uid}/messages/direct', 
    templateUrl: 'views/chat/_message.html', 
    controller: 'MessageController', 
    controllerAs: 'messageCtrl', 
    resolve: { 
     messages: function ($stateParams, MessageService, profile) { 
     return MessageService.forUsers($stateParams.uid, profile.$id).$loaded(); 
     }, 
     channelName: function ($stateParams, UserService, $q) { 
     // create a deferred for this function 
     var deferred = $q.defer(); 
     // load async data with UserService.all's promise 
     UserService.all.$loaded() 
      .then(function() { 
       var name = UserService.getDisplayName($stateParams.uid); 
       deferred.resolve(name); 
      }); 
     // return promise 
     return deferred.promise; 
     } 
    } 
}) 

然而,在getDisplayName我只想建議恢復回來的對象,而不是僅僅的名字,作爲整個集由火力地堡同步。

相關問題