Я начинаю вторую попытку создания приложения с KO, поэтому, пока я чувствую, что мое понимание библиотеки проходимо, мое выполнение с использованием этого по-прежнему требует работы. У меня вопрос о сложной модели для представления, которое не представляет собой только один логический объект.Complex KnockoutJS View Model
Учитывая сложный или составной вид модели, где свойства основного ViewModel сами являются объектами:
var mainViewModel = function(data){
var self=this;
self.user = new UserModel();
self.roles = new RolesCollectionModel();
}
function UserModel(data){
var self=this;
self.Name = ko.observable(data.name);
}
function RolesCollectionModel(data){
var self=this;
self.Items = ko.observableArray(data.items);
}
Мне кажется, что KO признает только связывание на первом уровне свойств, что не существует «наблюдаемым пузыриться. Таким образом, для меня, чтобы использовать данные, обязательные для дочерних объектов, оказывается, что я должен объявить тех, наблюдаемыми, а также:
var correctViewModel = function(data){
var self=this;
self.SetUserModel= function(userData) {
this.user = ko.observable(userData);
}
self.SetRoles = function (data) {
this.roles = ko.observableArray(data);
}
}
и, соответственно, в моем HTML, если я хочу, чтобы связать имя свойства userModel:
<input data-bind:'textInput:userModel().name'/>
Мои вопросы, то есть:
Я правильно мой вывод, что «наблюдаемый пузыриться» не происходит, и это единственный способ достичь связывания с свойствами, находятся на нескольких уровнях в графе объектов?
Предполагая, что я прав в 1, синтаксис выше для меня странный. userModel и имя являются наблюдаемыми, но чтобы мои примеры работали, я должен ссылаться на объект как userModel(). name. Я ожидал бы привязки к userModel.name. Это смущает здесь, верно?
** Я отредактировал это, чтобы включить сеттеры, которые я использовал бы. Идея заключается в том, что модель верхнего уровня будет составлена / связана после> 1 вызовов API. Я сделал это так, потому что это более естественно в смысле ОО, но, похоже, от этого разговора я мог бы так же легко установить свойство объекта явно после ответа от API, например:
var topModel = new CorrectViewModel();
$.ajax({...}).done(function(data){
topModel.Users=(new UserModel(data));
})
Могу ли я спросить Каков тем более идиоматический стиль использования?
Невозможно наблюдать основные свойства модели просмотра, нет. [Вот упрощенный пример] (http://jsfiddle.net/ktmv4pcz/) того, что у вас есть выше. –
Спасибо Джеймс, я вижу твои работы, как я и ожидал. Мой не сделал, например. Мне пришлось использовать синтаксис, который я показал здесь, поэтому я разместил этот вопрос. Я буду копаться дальше. – monkeydeus
Я вижу, что происходит. Я непреднамеренно отказался от ключевой информации. В модели, с которой я тестировал, я создал методы setter, потому что модель верхнего уровня не была бы создана сразу. Свойства дочерних объектов, скорее всего, будут вызваны отдельными вызовами API: [link] (http://jsfiddle.net/monkeydeus/BnEDD/) – monkeydeus