javascript - 如何使用 Knockout.js 将下拉列表中的选定项目自动更新到 SignalR 中的所有已连接客户端?

标签 javascript data-binding asp.net-mvc-4 knockout.js signalr

已解决:

添加了新的更正代码行并对旧代码行进行了注释。


对于使用 SignalR实时 应用程序,我希望所有连接的客户端都能实时看到用户所做的更改。

使用简单的文本框没问题,但是当我使用下拉列表时:当用户选择一个项目时,我想要选择的下拉列表中的项目自动设置(自动更新)给所有连接的客户端。

Knockout.js 似乎是显而易见的选择,但我认为我在订阅...或其他地方有问题?

我有什么:

(ASP .NET Razor) 下拉菜单:

//@Html.DropDownListFor(model => model.UserProfile.UserId, (SelectList)ViewBag.DDLUsersId, "Select User", new { @class = "ui-corner-all", @data_bind="value: selectedResponsible_UserId" })

@Html.DropDownListFor(model => model.UserProfile.UserId, (SelectList)ViewBag.DDLUsersId, "Select User", new { @class = "ui-corner-all", @data_bind="value: Responsible_UserId" })

(HTML) 生成:

//<select class="ui-corner-all" data-bind="value: selectedResponsible_UserId" id="UserProfile_UserId" name="UserProfile.UserId"><option value="">Select User</option>

<select class="ui-corner-all" data-bind="value: Responsible_UserId" id="UserProfile_UserId" name="UserProfile.UserId"><option value="">Select User</option>
    <option value="1">test1</option>
    <option value="2">test2</option>
</select>

(JavaScript) View 模型:

function taskViewModel(id, title, Responsible_UserId, ownerViewModel)
{
    this.taskId = id;

    this.title = ko.observable(title);

    //this.selectedResponsible_UserId = ko.observable(Responsible_UserId);

    this.Responsible_UserId = ko.observable(Responsible_UserId);

    this.notification = function (b) { notify = b }

    var self = this;

    this.title.subscribe(function (newValue) 
    {
        ownerViewModel.updateTask(ko.toJS(self));
    });

    //this.selectedResponsible_UserId.subscribe(function (newValue) 

    this.Responsible_UserId.subscribe(function (newValue) 
    {
        ownerViewModel.updateTask(ko.toJS(self));
    });
}

(JavaScript) Function from Client-Side 用指定的对象从Server-Side 调用函数:

this.updateTask = function (task)
{    
    if (notify) 
        this.hub.server.s_Update(task);
}

(C#) Function 来自 Server-Side 修改 DB 中的值并从 < strong>Client-Side 为所有连接的 Clients 指定对象:

public bool S_Update(Task updatedTask)
{
    using (var context = new ToDoDbContext())
    {
        var oldTask = context.Tasks.FirstOrDefault(t => t.taskId == updatedTask.taskId);

        if (oldTask == null)
            return false;
        else
        {
            oldTask.title = updatedTask.title;

//??? Here, value 'updatedTask.Responsible_UserId' was NULL !!!
            oldTask.Responsible_UserId = updatedTask.Responsible_UserId;

            context.SaveChanges();

            Clients.All.C_TaskUpdated(oldTask);

            return true;
        }
    }
}

(JavaScript) 来自客户端函数应该更新界面>:

this.hub.client.C_TaskUpdated = function (t)
{
    var task = ko.utils.arrayFilter(tasks(), function (value) { return value.taskId == t.taskId; })[0];

    notify = false;
        task.title(t.title);    

//!! obvious, here was set to NULL.     
        //task.selectedResponsible_UserId(t.Responsible_UserId);

        task.Responsible_UserId(t.Responsible_UserId);
    notify = true;
};

最佳答案

如果我没听错,你的 prop 在客户端被称为 selectedResponsible_UserId,在服务器端被称为 Responsible_UserId。看起来这种潜在的不匹配导致了您的问题。

关于javascript - 如何使用 Knockout.js 将下拉列表中的选定项目自动更新到 SignalR 中的所有已连接客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14048324/

相关文章:

javascript - 类型错误 : proficiency is not a function - but it is

java - 不改变 POJO 的不区分大小写的 JSON 到 POJO 的映射

asp.net - 在 MVC 5 中使用 javascript 代码 - 将其放在哪里

c# - MVC Post 导致 QueryString 在重新加载同一 View 时丢失

javascript - VueJS : How to pass props while redirecting

javascript - 这个CSS卡片翻转效果如何在缺少CSS3支持的情况下优雅的回退呢?

javascript - 我的 jQuery 点击功能不工作

asp.net - 将 ControlParameter 添加到 SqlDataSource 会阻止查询和数据绑定(bind)吗?

wpf - 使用 Caliburn micro 的动态菜单

c# - asp.net中MySQL的连接字符串是什么