0

私は次のJavaScriptビューモデルを持っています(リファクタリングが必要ですが、最初にすべてを機能させることを目指しています)。セットアップは MessageViewModels のコレクションを保持する MessagesViewModel でありMessageViewModelはFeedbackViewModelsのコレクションを保持します。新しいメッセージを投稿すると、すべて正常に機能し、ハブがコールバックして UI が更新されます。問題は、コメントにフィードバックを追加したときです。フィードバックはデータベースに保持されますが、コールバックは呼び出されません。コードを参照してください。

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;
    }

ビューモデル

$(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 > 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();
        });
    });
});

どんな助けでも感謝します、ありがとう。

4

1 に答える 1