Javascript 如何使用angularfire按id检索数据

Javascript 如何使用angularfire按id检索数据,javascript,angularjs,firebase,angularfire,angular-promise,Javascript,Angularjs,Firebase,Angularfire,Angular Promise,我使用教程创建了angularfire聊天应用程序。它是一个使用ui路由器的独立应用程序。我成功地将它作为一个视图集成到我的应用程序中,但这并不实际。我需要能够在任何视图上使用聊天。我无法将解析函数移动到控制器。我已经阅读了一些文档,我相信它正在返回一个我需要在控制器中解决的承诺。教程的链接在这里。 这是我试图摆脱的ui路由器 .state('channels.direct', { url: '/{uid}/messages/direct',

我使用教程创建了angularfire聊天应用程序。它是一个使用ui路由器的独立应用程序。我成功地将它作为一个视图集成到我的应用程序中,但这并不实际。我需要能够在任何视图上使用聊天。我无法将解析函数移动到控制器。我已经阅读了一些文档,我相信它正在返回一个我需要在控制器中解决的承诺。教程的链接在这里。

这是我试图摆脱的ui路由器

.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));
        }
    };
$$state: Object
__proto__: Promise
这是我到目前为止在控制器中得到的信息

 $scope.directMessage = function (uid) {
        UserService.all.$loaded().then(function () {
            $scope.selectedChatUser = '@' + UserService.getDisplayName(uid);
        });
        $scope.selectedChatUserMessages = MessageService.forUsers(uid, profile.$id).$loaded();
    };
我要把钱还给你

$scope.selectedChatUser

好的。问题在于消息服务

这是我当前从消息服务返回的内容

  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));
        }
    };
$$state: Object
__proto__: Promise

如何解决此问题?

您试图在
channelName
函数中从承诺内部返回

.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;
      }
   }
})
你得到的是一个未解决的承诺。您希望将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
中,我建议返回对象,而不仅仅是名称,因为整个集合都是由Firebase同步的