【问题标题】:How to render or populate data coming from websocket services like pusher using angularjs ngRepeat?如何使用 angularjs ngRepeat 渲染或填充来自 websocket 服务(如 pusher)的数据?
【发布时间】:2016-05-30 10:47:38
【问题描述】:

我是实时应用程序的新手,它困扰了一段时间如何使用 angularjs ngRepeat 指令呈现来自 websocket 服务(如推送器)的数据。 以下是来自 api 的响应 以及我拥有的 sn-ps 代码。

客户端。

$scope.exam_results = [{}];
    var client = new Pusher('some_key');
    var pusher = $pusher(client);
    var my_channel = pusher.subscribe('some_channel');
    my_channel.bind('some_event', function(data) {
        $scope.some_var = data;
        console.log($scope.some_var);
    });

服务器端

.....
LaravelPusher::trigger($some_channel, 'some_event',  $some_var);

顺便说一句,我使用 laravel 和 angularjs。

在这里需要一点帮助。谢谢你^_^

API 响应

[
  {
    "id": 1,
    "subject_id": 1,
    "student_id": 1,
    "correct": 0,
    "incorrect": 30,
    "created_at": "2016-02-17 17:47:36",
    "updated_at": "-0001-11-30 00:00:00",
    "exam_taken": 1,
    "students": {
      "id": 1,
      "firstname": "Mary Rose",
      "lastname": "Labrador",
      "middlename": "Neneng",
      "birthdate": "2016-02-10",
      "email": "maryrose@dummy.com",
      "username": "maryrose",
      "gender": "Female",
      "password": "65ce8ebfe1687cb8a5460fab48bcea413a0e17f53636912ac4667f056eeca461",
      "guardianname": "Unnamed",
      "guardiancontact": "+6309083561578",
      "personalcontact": "+6309083561578",
      "department_id": 1,
      "taken_exam": 1,
      "created_at": "2016-02-16 00:00:00",
      "updated_at": "2016-02-17 17:47:58"
    },
    "subjects": {
      "id": 1,
      "subjectname": "Algorithm",
      "slug": "algorithm",
      "time": "10:00:00",
      "schedule": "MWF",
      "teacher_id": 1,
      "created_at": "2016-02-12 09:28:27",
      "updated_at": "2016-02-12 09:28:27"
    }
  },
  {
    "id": 2,
    "subject_id": 1,
    "student_id": 4,
    "correct": 0,
    "incorrect": 30,
    "created_at": "2016-02-17 18:54:11",
    "updated_at": "-0001-11-30 00:00:00",
    "exam_taken": 1,
    "students": {
      "id": 4,
      "firstname": "Joan Phylis",
      "lastname": "Rogano",
      "middlename": "Latoja",
      "birthdate": "2016-02-14",
      "email": "joangwapa@dummy.com",
      "username": "joan143",
      "gender": "Female",
      "password": "65ce8ebfe1687cb8a5460fab48bcea413a0e17f53636912ac4667f056eeca461",
      "guardianname": "Unnamed",
      "guardiancontact": "+639083561578",
      "personalcontact": "+639083561578",
      "department_id": 1,
      "taken_exam": 1,
      "created_at": "2016-02-16 00:00:00",
      "updated_at": "2016-02-17 18:57:43"
    },
    "subjects": {
      "id": 1,
      "subjectname": "Algorithm",
      "slug": "algorithm",
      "time": "10:00:00",
      "schedule": "MWF",
      "teacher_id": 1,
      "created_at": "2016-02-12 09:28:27",
      "updated_at": "2016-02-12 09:28:27"
    }
  }
]

HTML

<tr ng-reapeat="result in exam_results track by $index">
                    <td>
                        <span class="text-success">@{{result.students.lastname}}, 
                            @{{result.students.firstname}} @{{result.students.middlename}}
                        </span>
                    </td>
                    <td><a href="javascript:void(0);" class="fa fa-eye pull-right"> View</a></td>
                </tr>

【问题讨论】:

  • 如果$scope.some_var,是一个数组,为什么不直接使用Array.concat()来添加新的data呢?然后 Angular 的摘要循环会渲染它。
  • 请展示一些片段
  • $scope.some_var.concat(数据)。是吗?
  • 把它变成了一个答案,所以 sn-p 是可读的。

标签: javascript php angularjs laravel-5.1 pusher


【解决方案1】:

$scope.exam_results 是一个数组,为什么不直接使用Array.concat() 来添加新的data 呢?然后 Angular 的摘要循环会渲染它:

$scope.exam_results = [];

// your websocket code

my_channel.bind('some_event', function(data) {
    $scope.exam_results.concat(data);
    console.log($scope.exam_results);
});

显然,来自 websocket 的数据需要随着时间的推移而具有相同的格式,并且还需要一个对象数组。您可以将ng-repeat 绑定到$scope.exam_results

<ul>
   <li ng-repeat="result in exam_results track by $index">
       {{result.students.firstname}}
   </li>
</ul>

【讨论】:

  • 是的,它是一个数组。不过,我不知道您要渲染什么。由于它只是一个 PNG,因此很难说所有数据集是否都相同。
  • code [ {“id”:1,“subject_id”:1,“student_id”:1,“正确”:0,“不正确”:30,“created_at”:“2016- 02-17 17:47:36”,“updated_at”:“-0001-11-30 00:00:00”,“exam_taken”:1,“学生”:{“id”:1,“名字”:“ Mary Rose", "lastname": "Labrador", "middlename": "Neneng", "birthdate": "2016-02-10", },
  • 当我尝试将 $scope.some_var 初始化为一个空数组时,它是一个带有您的 sn-p 的空数组,但在对象数组中,日志结果为 [Object]
  • [Object] 作为对象数组正是您的 PNG 中的内容。请参阅我更新的答案如何呈现它。
【解决方案2】:

如果您的事件数据始终是对象数组。

你可以这样做 -

$scope.exam_results = []; // Changed this to Array.
var client = new Pusher('some_key');
var pusher = $pusher(client);
var my_channel = pusher.subscribe('some_channel');
my_channel.bind('some_event', function(data) {
    $scope.exam_results.concat(data) // Concatinating Array to merge with existing Results.
});

现在你可以有这样的视图 -

<div ng-repeat="result in exam_results">
 <!-- HTML to render Result -->
 <span>{{result.students.first_name}}</span>
</div>

希望这会有所帮助。

【讨论】:

  • 如果是对象数组呢?
  • 编辑了答案以适应两者。现在无论是单个对象还是对象数组都无关紧要。
  • 当我将 $scope.exa_results 初始化为一个空数组([])时,我在控制台上得到了空数组,如果用 [{}] 初始化它,我在控制台中得到了 [Object],来自 api 的响应是两个对象
  • 是的。所以你基本上需要做的是;当 Pusher 向您发送事件数据时,您需要在 $scope.exam_results 中添加这些对象。您在控制台中看到的意思是 - 数组包含对象,但该对象什么都没有。
  • 但是当我以这种方式尝试时 $scope.exam_result = data 我得到了这个 [Object Object]
猜你喜欢
  • 2019-03-27
  • 2018-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-22
  • 1970-01-01
  • 1970-01-01
  • 2018-05-29
相关资源
最近更新 更多