我正在创建一个后端服务,它将新文章写入数据库,并在完成后将更改发布到前端层的侦听客户端。我的问题是这些BE更新没有触发前端层的订阅者。
直接测试TaskHub (signalR后端asp.net hub)层似乎正在工作,但UI没有更新。以下是各层的相关代码(我可能遗漏了一两件事-询问是否有什么问题)。
事物的顺序:
从在客户端调用这个开始:
var taskHub = $.connection.taskHub;
$.connection.hub.start();
然后我有这个Knockout函数来做更新:
self.AddQuickNews = function() {
taskHub.server.AddAndUpdateQuickNews(self.newContent()); /just a string
}
在ASP。. NET后端,我有以下方法来处理这个:
public void AddAndUpdateQuickNews(string newContent)
{
ArticleServices.AddQuickNews(newContent); //add a new record
var quicknews = ArticleServices.GetQuickNews(); // get all records
Clients.All.updateQuickNews(quicknews); // pass back to clients
}
在客户端处理结果:
taskHub.client.UpdateQuickNews = function (quicknews) {
quicknewsmodel.quicknews(quicknews);
console.log("SignalR -> " + quicknews);
//console.log("Fra UpdateMatches: " + matches);
}
XHR调用测试后端
self.AddQuickNews = function () {
var url = 'api/MainPage/AddQuickNews';
var params = "?content=" + self.newContent();
$.ajax({
url: url + params,
type: 'GET',
dataType: 'json',
contentType: 'application/json; charset=utf-8',
success: function (data) {
taskHub.server.updateQuickNews(data);
},
error: function () {
//alert("error");
}
});
}
在我看来,这是因为当你在客户端声明侦听器时,你在第一个字母中使用大写。这种行为在SignalR
中是不允许的。你必须改变你的监听器变成:
taskHub.client.updateQuickNews = function (quicknews) {
quicknewsmodel.quicknews(quicknews);
console.log("SignalR -> " + quicknews);
//console.log("Fra UpdateMatches: " + matches);
}
taskHub.server.addAndUpdateQuickNews(self.newContent()); /just a string
希望这对你有帮助