MEAN Stack从UserId获取每行的用户名

时间:2016-01-28 06:39:33

标签: javascript angularjs node.js mean-stack

我正在尝试获取一行评论中每个用户的用户数据(例如用户名)。我保留了我的用户信息(登录凭证在另一个型号/控制器上),那么有没有办法在视图上访问和显示用户名?

以下是我的JSON代码:

{
   "_id": "56873fc9182b3741059357d0",
   "longitude": 113.83507800000007,
   "latitude": 22.1533884,
   "location": "Hong Kong",
   "name": "Hong Kong",
   "__v": 0,
   "category": "Attraction",
   "reviews": [
   {
      "comment": "Add the comment to the form",
        "rating": 3.5,
        "userId": 11,
        "review_id": "44NL7kkwhy72"
    },
    {
       "comment": "Hello test",
       "rating": "3.4",
        "userId": "56809c0cf0a264b101a1dd61",
        "review_id": "jN7f1iFlQVha"
      },
      {
        "comment": "Hello test ty",
        "rating": "3.7",
        "userId": "56863c8f2959b4c601fbd9eb",
        "review_id": "QcJpw4yopF1q"
      }
   ]
  },

//查看某个位置的所有评论

    .controller('AllReviews', function($scope, $stateParams, LocFac, UserFac) {   

    id = $stateParams.id;  

    LocFac.getLocation(id).then(function(data) { 
       $scope.locations = data.data; 
       $scope.reviews = data.data.reviews;  

      //variables to show information on location reviews
       $scope.lengthrev = (data.data.reviews).length; 
       $scope.locationname = data.data.name; 

       //addition of values and retrieve the value
        $scope.getTotal = function(){
         var total = 0;
         for(var i = 0; i < $scope.lengthrev; i++){
          var review = $scope.reviews[i];

          User.getUser(review).then(function(datat) { 
             $scope.locun = datat.username; 
          }); 

         total += review.rating; 
        }
        return total;
       }

      grandtotal = $scope.getTotal(); 

      //get average of all values \
      $scope.averagereviews = grandtotal/($scope.lengthrev); 
   }); 
})

我的位置评论视图

<ion-view view-title="All Reviews" class="all_reviews">
 <ion-content class="all_reviews"> 

<h3>{{ locationname }}</h3>  

<h3>Average Rating: {{ averagereviews }} <ng-rate-it name="rating" ng-model="averagereviews" resetable="false" read-only="true"></ng-rate-it>/ {{ lengthrev }} Reviews </h3> 

<ion-list>
  <ion-item data-ng-repeat="location in locations.reviews"> 
        <ng-rate-it name="rating" ng-model="location.rating" resetable="false" read-only="true"></ng-rate-it>  
       {{ location.userId }}
       <h4>{{ location.review_id }}</h4>  
       <h4>{{ location.comment }}</h4>
  </ion-item> 
</ion-list> 

1 个答案:

答案 0 :(得分:1)

考虑到你的两个aysnc操作,(一个用于获取评论,另一个用于获取用户名)我认为这种方法更合适。

  1. 首先获取评论。
  2. 显示评论。
  3. 在显示评论时,使用UserFac使用ng-init指令异步获取用户名。
  4. 我已经创建了一个demo plunker作为示例,其中包含您提供的示例数据。

    示例:

    Demo Plunker

    <强> app.js

    var app = angular.module("app", []);
    app.factory('LocFac', function($http) {
      var factory = {};
    
      factory.getLocation = function(id) {
        return $http({
          method: 'GET',
          url: 'data.json'
        });
      }
    
      return factory;
    });
    app.factory('UserFac', function($http) {
      var factory = {};
    
      factory.getUser = function(id) {
        return $http({
          method: 'GET',
          url: 'user.json'
        });
      }
    
      return factory;
    });
    app.controller('AllReviews', function($scope, LocFac, UserFac) {
      $scope.show = false;
      $scope.testClick = function() {
        id = "56873fc9182b3741059357d0";
        LocFac.getLocation(id).then(function(data) {
          $scope.reviews = data.data.reviews;
          $scope.lengthrev = (data.data.reviews).length;
          $scope.show = true;
        });
      }
    
      $scope.getUserName=function(review) {
        UserFac.getUser(review.id).then(function(user) {
         review.userName=user.data.userName;
         review.showUserName=true;
        });
      }
    })
    

    <强> HTML:

    <!DOCTYPE html>
    <html>
    
      <head>
        <script data-require="angular.js@1.4.8" data-semver="1.4.8" src="https://code.angularjs.org/1.4.8/angular.js"></script>
        <link rel="stylesheet" href="style.css" />
        <script src="script.js"></script>
      </head>
    
      <body ng-app="app" ng-controller="AllReviews">
        <button ng-click="testClick()">Click here</button>
        <ul ng-show="show" ng-repeat="review in reviews track by $index" ng-init="getUserName(review)">
          {{review | json : spacing}}
          <p ng-show="review.showUserName">
            {{review.userName}}
          </p>
        </ul>
      </body>
    
    </html>
    

    <强>解释

    ng-repeat中迭代审阅数组时,我们将审阅对象传递给UserFac服务以获取userName。此服务将在审阅对象本身内设置名称。