Note that there are some explanatory texts on larger screens.

plurals
  1. POSignalR & Knockout parent - child callback issue
    primarykey
    data
    text
    <p>I have the following javascript view models (need refactoring, but I'm looking to get everything functioning first), and the setup is a MessagesViewModel which holds a collection of <strong>MessageViewModels</strong> and the <strong>MessageViewModel</strong> holds a collection of <strong>FeedbackViewModels</strong>. When posting a new message, it all works fine and the hub calls back and the UI is updated. The issue is when I add feedback to the comment, the feedback persists to the database, but the callback isn't invoked - see the code:</p> <pre><code>public bool AddMessageFeedback(string txtFeedbackComments, string hdnMessageId, int userId) { bool result = false; try { var message = new Message { SDUID = userId, MessageText = txtFeedbackComments, MessageDate = DateTime.Now.Date, MessageTime = Convert.ToDateTime(DateTime.Now.TimeOfDay.ToString()), Poster = UserManager.GetItem(userId), MessageDateAsString = DateTime.Now.Date.ToString(), MessageTimeAsString = DateTime.Now.TimeOfDay.ToString(), MessageDay = DateTime.Now.DayOfWeek.ToString() }; MessageManager.AddMessageFeedback(message, Convert.ToInt64(hdnMessageId)); Clients.All.messageFeedbackAdded(message); result = true; } catch (Exception) { Clients.Caller.raiseError("Unable to add feedback."); } return result; } </code></pre> <p>ViewModels</p> <pre><code>$(function () { $(function () { function messageFeedbackViewModel(feedbackText, poster, messageDay, messageDate, messageTime, owner) { this.poster = poster; this.feedbackText = feedbackText; this.datePosted = messageDay.substr(0, 3) + ', ' + messageDate.substr(0, 10) + ' ' + messageTime.substr(0, 5); var self = this; } function messageViewModel(MessageID, messageText, SDUID, SportID, poster, sport, feedback, messageDate, messageDay, messageTime, owner) { this.hub = $.connection.messagesHub; //message variables, initialised from params this.MessageID = MessageID; this.SDUID = SDUID; this.SportID = SportID; this.poster = poster; this.messageText = messageText; this.sport = sport; this.datePosted = messageDay.substr(0, 3) + ', ' + messageDate.substr(0, 10) + ' ' + messageTime.substr(0, 5); //message feedback collection this.messageFeedback = ko.observableArray([]); //html variables this.newMessageFeedback = ko.observable(); //reference to message feedback collection var messageFeedback = this.messageFeedback; var self = this; var notify = true; //callback from server side hub this.hub.client.messageFeedbackAdded = function (newMessageFeedback) { self.messageFeedback.push(new messageFeedbackViewModel(newMessageFeedback.MessageFeedbackText, newMessageFeedback.Poster, newMessageFeedback.MessageFeedbackDay, newMessageFeedback.MessageFeedbackDateAsString, newMessageFeedback.MessageFeedbackTimeAsString, self)); }; //build message feedback VM's if (feedback){ if (feedback.length &gt; 0) { var mappedFeedbackMessages = $.map(feedback, function (feed) { return new messageFeedbackViewModel(feed.MessageFeedbackText, feed.Poster, feed.MessageFeedbackDay, feed.MessageFeedbackDateAsString, feed.MessageFeedbackTimeAsString, self); }); messageFeedback(mappedFeedbackMessages); } } //client side post this.createMessageFeedback = function () { var innerMessageFeedback = this.newMessageFeedback(); var userId = $('#userID').val(); var messageId = this.MessageID; this.hub.server.addMessageFeedback(innerMessageFeedback, messageId, userId).done(function () { console.log('message saved!'); }).fail(function (error) { console.warn(error); }); this.newMessageFeedback(''); }; } function messagesViewModel() { this.hub = $.connection.messagesHub; //messages collection this.messages = ko.observableArray([]); //html variables this.newMessageMessageID = ko.observable(); this.newMessageSDUID = ko.observable(); this.newMessageSportID = ko.observable(); this.newMessagePoster = ko.observable(); this.newMessageMessageText = ko.observable(); //reference to messages collection var messages = this.messages; var self = this; var notify = true; var userId = $('#userID').val(); //load messages, calling server side hub method this.init = function () { this.hub.server.getAll(userId); }; //callback from server side hub sending messages to client this.hub.client.allMessagesRetrieved = function (allMessages) { var mappedMessages = $.map(allMessages, function (message) { return new messageViewModel(message.MessageID, message.MessageText, message.SDUID, message.SportID, message.Poster, message.Sport, message.Feedback, message.MessageDateAsString, message.MessageDay, message.MessageTimeAsString, self); }); messages(mappedMessages); }; //callback from server side hub sending error messages to client this.hub.client.raiseError = function (error) { $("#error").text(error); }; //call back from server side hub sending new message and pushing to collection this.hub.client.messageCreated = function (newMessage) { messages.splice(0, 0, new messageViewModel(newMessage.MessageID, newMessage.MessageText, newMessage.SDUID, newMessage.SportID, newMessage.Poster, newMessage.Sport, newMessage.Feedback, newMessage.MessageDateAsString, newMessage.MessageDay, newMessage.MessageTimeAsString, self)); }; //client side method from form post this.createMessage = function () { var selectedSport = $('#ddlSport option:selected').text(); var message = { messageText: this.newMessageMessageText(), SDUID: userId, SportID: this.newMessageSportID(), Sport: selectedSport }; this.hub.server.add(message).done(function () { console.log('message saved!'); }).fail(function (error) { console.warn(error); }); this.newMessageMessageText(''); this.newMessageSDUID(''); this.newMessageSportID(''); this.newMessagePoster(''); }; } //set up the viewmodel var viewModel = new messagesViewModel(); ko.applyBindings(viewModel); //call to initialise $.connection.hub.start(function () { viewModel.init(); }); }); }); </code></pre> <p>Any help would be appreciated, thanks.</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload