2015-12-20 3 views
0

EDIT - добавление более «реалистичного кода» за комментарий. Целью дизайна является то, что все модели обернуты моделями просмотра, а модель представления действует как прокси-сервер модели. Представление никогда не связывается напрямую с моделью. Кроме того, у меня есть отдельный класс javascript, который отправляет и получает модели на/с сервера, который вводится как зависимость в модели представления.Как автоматически обновить свойство модели из модели просмотра?

Ниже приведено MessageModelcontent - это необработанный контент, который пользователь набрал и/или то, что вернул сервер. MessageViewModel предоставляет свойство message, которое является форматированной версией свойства модели content.

function MessageModel(id, content, nick) { 
    var self = this; 
    self.nick = nick; 
    self.content = content; 
    self.id = id; 
} 

// view needs to bind to properties that only exist on the view model 
function MessageViewModel(messageModel, dataService) { 
    var self = this; 
    self.id = ko.observable(messageModel.id); 
    self.message = ko.computed(function() { 
     // format the content for the view 
     return messageModel.nick + " <" + messageModel.content + ">"; 
    }); 
    self.saveMessage(function() { 
     // send the model up to the server 
     dataService.saveMessage(self.model); 
    }); 
    self.model = messageModel; 
} 

С чем я писал выше, изменения в модель представления должны быть прижаты к модели и при получении моделей с сервера, изменения должны быть прижаты к отразить в модели представления, а затем к просмотру , Как это сделать в нокауте?

+0

Если вы хотите обновить 'messageModel.id' через привязку, то он должен быть« наблюдаемым »; в настоящее время идентификатор viewModel является вашим единственным наблюдаемым – house9

+0

@ house9 - не хотите обновлять модель путем привязки. Хотите обновить модель представления с помощью привязки, а затем обновите модель с помощью модели представления. Нехорошо сочетать модель напрямую с представлением. –

+0

Вы должны показать более реалистичный код. Не имеет смысла создавать объект для хранения 'id', а затем переносить его в другой объект с помощью другого' id', чтобы закончить с двумя зависимыми идентификаторами id. Если 'id' был тем, что вы не знали, я уверен, что у вас будет простая модель просмотра с идентификатором' id'. Поэтому, пожалуйста, сделайте образец более реалистичным, объяснив, почему у вас есть вложенная модель, что вы хотите с ней произойти, когда изменяется идентификатор родителя и т. Д. Можете ли вы улучшить свой вопрос с помощью этой информации? – JotaBe

ответ

1

Лучше думать о моделировании приложения, а не о внедрении модели данных отдельно в коде приложения. Модель данных находится на сервере, не так ли? Это полностью избыточно, чтобы копировать значения из вашей модели просмотра в вашу модель данных в приложении. Скопируйте их на сервер. Но если вы хотите, вы можете subscribe наблюдаемому и скопировать значение в другом месте.

См. Документы на MVVM and ViewModels и обратите внимание, что различие между «сохраненными» данными и данными в приложении. Данные (обычно) хранятся на сервере. После того, как вы внесли его в приложение, это данные в виде viewmodel. Интерфейс между моделью просмотра и моделью (обычно) вызывает вызовы ajax, которые загружают данные в приложение и сохраняют их обратно на сервер.

Единственное, что вам нужно для моделирования в javascript - это ваше приложение, потому что это все, что вы пишете. Это не источник данных ни для чего другого. Если фактическая модель данных изменяется, вам нужно либо изменить поведение приложения, либо вы можете выделить изменения в процедурах загрузки и сохранения. Существует нулевое значение при наличии промежуточной модели данных.

+0

Да, вы говорите, это вообще не MVVM. Совершенно нормально иметь модели представлений, которые имеют некоторые или все те же свойства, что и модель. Что касается сервера (который не имеет ничего общего с MVVM), то DTO - это то, что должно быть передано по кабелю (в настоящее время это мои модели). Я буду смотреть на подписку, хотя. –

+0

Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. - [Из обзора] (/ review/low-quality-posts/10636745) –

+0

@ O.O См. Мой обновленный ответ. –

Смежные вопросы