KnockoutJS обновляет ViewModel на скрытой странице

У меня есть индексная страница, где я отображаю список элементов. Индексная страница доступна для наблюдения. Я нажимаю на запись в списке, чтобы загрузить страницу сведений, где пользователь может изменить данные. Я могу успешно опубликовать изменения на сервере с помощью jQuery ajax, и мне возвращается обновленная запись, поэтому я могу обновить список на странице индекса. Я не могу понять, как обновить подчиненные данные для индексной страницы результатами публикации обновления на сервере. Я попытался создать новую модель IndexViewModel, но пользовательский интерфейс не отражает новую модель. Я пробовал ko.mapping.fromJS(sourceData, targetObservableViewModel), но пользовательский интерфейс страницы индекса не обновляется. Как я могу обновить базовые данные для страницы индекса из успешной отправки ajax на совершенно другой странице?

        ApplicationUtils.AjaxRequestSendData
    (
        'POST',
        saveUrl,
        dataModel,
        function (jsonFromServer)
        {
            updateViewModel(jsonFromServer, self.activeGamesList);
            history.back();
        },
        function (resultsFromServer)
        {
            alert('errror happened.  not sure what happened though.');
        }           
    );

var updateViewModel = function (sourceData, targetObservableViewModel){
ko.mapping.fromJS(sourceData, targetObservableViewModel);};

Спасибо за вашу помощь.


person Tom Schreck    schedule 05.11.2013    source источник


Ответы (2)


Я бы разместил комментарий вместо ответа, чтобы запросить дополнительную информацию о других используемых технологиях, но пока недостаточно представителей :(

В этом случае можно использовать два решения:

  1. Просто, но дорого: когда ваша модель представления загружается, первое, что вы делаете, это удаляете существующие данные и запрашиваете новые данные с сервера.

  2. Заставьте другой объект javascript хранить ваши данные и передавать их через разные модели просмотра. В этом случае вместо того, чтобы возвращаться к серверу и обратно за новыми данными, ваши модели представления будут содержать только указатели на данные, и при сохранении вы сообщите этому объекту javascript обработать ваше сохранение/перезагрузку. Как только данные изменятся, ваша другая модель представления мгновенно «увидит» изменение, потому что она содержит указатель на эти данные.

Второй вариант основан на действительно простом и эффективном решении, предлагаемом в шаблоне Hot Towel SPA, поэтому, если вы можете, я предлагаю вам проверить его и посмотреть, сможете ли вы использовать что-либо из него.

person Dominictus    schedule 05.11.2013
comment
Похоже, Hot Towel может быть тем, что мне нужно для решения моей проблемы. Я думаю, что Hot Towel предоставит структуру приложения (подход), с которым я борюсь. Спасибо за направление. - person Tom Schreck; 06.11.2013

ko.mapping.fromJS может принимать 3 параметра... и чтобы использовать 3-й параметр, вы должны указать второй. Вы показали, что хотите сопоставить существующие данные источника с использованием конфигурации сопоставления targetObservableViewModel. То, что должно возвращаться с этим оператором, является сопоставленным объектом... однако вы ничего не назначаете. Если вы хотите, чтобы targetObservableViewModel был целью этого сопоставления, вам нужно добавить второй параметр. Если у вас нет конфигурации сопоставления для ссылки, просто используйте {}...пустой объект...

ko.mapping.fromJS(sourceData, {}, targetObservableViewModel)
person beauXjames    schedule 05.11.2013