更新后,knockout.js和SignalR库敲除映射js不会更新视图中的列表

时间:2018-08-13 08:18:13

标签: knockout.js signalr signalr-hub knockout-mapping-plugin

我有以下代码。但不会更新视图页面。

在我的app.js中

//集线器回调:更新用户列表

    hub.client.updateUserList = function (userList) {
        viewModel.setUsers(userList);
    };

在我的viewmodel.js中

 var viewModel = {
        Users: ko.mapping.fromJS([]), 
}
 viewModel.setUsers = function (userArray) {
        ko.mapping.fromJS(userArray, viewModel.Users);     
    };

我的SignalR集线器类

 private void SendUserListUpdate()
 {
            Users.ForEach(u => u.InCall = (GetUserCall(u.ConnectionId) != null));
            Clients.All.updateUserList(Users);
  }

此signalR SendUserListUpdate()正确更新用户列表。但不会在下面的索引页中更新。

 <div class="well user-list">
                            <ul class="nav nav-list">
                                <li class="nav-header">Online Users <small data-bind="text: Users().length"></small></li>
                                <!-- ko foreach: Users -->
                                <li class="user" data-bind="attr: { 'data-cid': ConnectionId, 'title': Username }">
                                    <a href="#">
                                        <!-- only using an a here for bootstrap styling -->
                                        <div class="username" data-bind="text: Username"></div>
                                        <div class="helper" data-bind="css: $parent.getUserStatus($data)"></div>
                                    </a>
                                </li>
                                <!-- /ko -->
                            </ul>
                        </div>

我使用的脚本。

   <script src="~/Scripts/adapter.js"></script>
    <script src="~/Scripts/jquery-3.3.1.min.js"></script>
    <script src="~/Scripts/knockout-3.4.2.js"></script>
    <script src="~/Scripts/knockout.mapping-latest.js"></script>
    <script src="~/Scripts/alertify.min.js"></script>
    <script src="~/Scripts/WebRtcDemo/bootstrap.min.js"></script>
    <script src="~/Scripts/jquery.signalR-2.3.0.min.js"></script>

2 个答案:

答案 0 :(得分:1)

从服务器映射新阵列数据时,添加映射对象参数。 而且,您还可以通过ko.observableArray([]);

创建可观察的数组
var viewModel = {
        Users: ko.observableArray([]), 
}
 viewModel.setUsers = function (userArray) {
        ko.mapping.fromJS(userArray, {}, viewModel.Users);     
    }; 

答案 1 :(得分:0)

我确实在集线器启动之后调用了客户端函数。我根据以下描述进行了修复,即升级信号R应该定义在集线器启动之前声明的客户端功能。 SignalR JS Client Methods Not Invoked