#javascript #jquery #knockout.js
#javascript #jquery #knockout.js
Вопрос:
Я создаю наблюдаемый массив из JSON, который поступает с сервера.
var ViewModel = function (data) {
var self = this;
self.list = ko.observableArray(data);
self.selected = ko.observable();
}
Я могу связать свойства с моим пользовательским интерфейсом
<form data-bind="with: selected">
<input type="text" data-bind="value: Name">
<button type="submit" class="btn btn-primary" data-bind="click: $root.create">Save</button>
</form>
У меня также есть метод редактирования по щелчку, который помещает выбранный объект в selected
self.edit = function (o) {
self.selected(o);
}
Код для итерации по списку:
<tbody data-bind="foreach: list">
<tr>
<td data-bind="text: Name"></td>
<td><button data-bind="click: $root.edit">edit</button></td>
</tr>
</tbody>
Код для создания выглядит следующим образом:
self.create = function (formElement) {
$(formElement).validate();
if ($(formElement).valid()) {
$.post(baseUri, $(formElement).serialize(), null, "json")
.done(function (o) {
self.list.push(o);
});
}
}
Итак, как я могу использовать ту же форму для добавления объекта? Я немного смущен привязкой данных к форме. Я не могу показать форму без выбора объекта.
Из всех примеров, которые я видел, кажется, мне нужно создать ViewModel с жестко заданными свойствами. Я не хочу этого делать, поскольку у меня много представлений со многими свойствами. Какой может быть наилучший подход к этому?
Обновить
Это именно то, что мне нужно: CRUD, но с ViewModel, который генерируется из JSON, и мне не нужно создавать его вручную.
Комментарии:
1. Не могли бы вы настроить JSFiddle или что-то в этом роде? Я не совсем понимаю ваш вопрос или проблему
2. Взгляните на плагин отображения knockout для автоматического создания наблюдаемых свойств в viewmodel: knockoutjs.com/documentation/plugins-mapping.html
3. Вам понадобится
Add
кнопка, которая будет служить в качестве «выбора», в который передается новый элементselected
. Затем свойства нового элемента могут быть установлены в вашейedit
форме.4. @WayneEllery — передача JSON в
observableArray()
делает то же самое, не создавая наблюдаемые для всех свойств.5. @Origineil — У меня есть кнопка добавления. Как я могу создать объект, аналогичный тому, что я получаю в JSON?
Ответ №1:
Может быть, это поможет вам, http://jsfiddle.net/3uZW7/7 /
function mapFactory(factory)
{
var self = this;
self.name = ko.observable(factory.name);
self.isEdited = ko.observable(false);
};
var ViewModel = function (data) {
var self = this;
self.list = ko.observableArray();
self.newFactory = ko.observable();
self.addNewFactory = function()
{
if (self.newFactory())
self.list.push(new mapFactory( { name: self.newFactory() } ));
};
self.toggleEdit = function(data)
{
data.isEdited( ! data.isEdited() );
};
self.save = function(data)
{
// ajax.. etc..
data.isEdited(false);
};
self.delete = function(data)
{
// ajax.. etc..
self.list.remove(data);
}
};
var viewModel = new ViewModel;
// Call/Retrieve ajax data and push to observableArray
var retrieveDataFromAjax = [
{ 'name' : 'Mike' },
{ 'name' : 'Jack' }
];
ko.utils.arrayForEach(retrieveDataFromAjax, function(data)
{
viewModel.list.push(new mapFactory( data ));
});
ko.applyBindings(viewModel);
Комментарии:
1. Используя этот пример, мне все еще нужно определить мои свойства ViewModel. У меня очень сложная модель и около 100 просмотров