Вот моя проблема, с которой я борюсь.Использование наблюдаемого массива нокаута для добавления динамического элемента пользовательского интерфейса
1- Я использую плагин сопоставления для создания модели нокаута ViewModel. Со стороны сервера у меня есть сложный объект, который имеет несколько свойств (не относящихся к этому вопросу). Помимо других свойств у меня есть свойство TotalofExpenses, а также есть один список, называемый Expenses (элемент расхода - это объект, который имеет количество и описание). Mapping плагин превратить этот список в ObservableArray и TotalofExpenses в observalbe
2- На пользовательском интерфейсе я хочу достичь следующего
- Сначала я хочу представить вход для статьи расходов. Два входных поля (один для суммы и один для описания)
- После того, как пользователь добавит описание и сумму расходов (оба), я хочу представить поля ввода для другой статьи расходов и показать текущие расходы где-нибудь (скажем, внизу Таблица). Поскольку пользователь продолжает добавлять дополнительные расходы, я продолжаю представлять новые поля ввода и продолжать отображать итоговые суммы
- Если пользователь вернется к ранее добавленной статье расходов и произнесет изменение, произнесите изменение суммы, которую я хочу обновить.
Ниже приведен код, которым я пытаюсь достичь описанной выше функциональности. Это НЕ работает так, как должно быть. Примечания: Я пытаюсь поставить только код, относящиеся к этой проблеме
var data = @Html.Raw(Model.ToJson());
//Add total expenses TotalShiftExpenses
var mappingOptionsForTotalShiftExpenses = {
create: function(options) {
return new ComputeTotalShiftExpenses(options.data);
}
};
var Expense = function(data) {
var self = this;
self.ShiftId = ko.observable(@Model.Shift.Id),
self.Id = ko.observable(0),
self.Amount = ko.observable(0),
self.Description = ko.observable("");
}
function ComputeTotalShiftExpenses(data) {
var self = this;
var model = ko.mapping.fromJS(data, {}, self);
model.TotalShiftExpenses = ko.computed(function() {
var sum = 0;
for (var i = 0; i < model.Shift.ShiftExpenses().length; i++) {
// if ((parseFloat(model.Shift.ShiftExpenses()[i].Amount)) > 0) {
sum += parseFloat(model.Shift.ShiftExpenses()[i].Amount());
}
//Add empty Expense to Observable array
if (parseFloat(model.Shift.ShiftExpenses()[ (model.Shift.ShiftExpenses().length - 1)].Amount()) > 0) {
model.Shift.ShiftExpenses
.push(new Expense({ "ShiftId": 0, "Id": 0, "Amount": 0, "Description": "" }));
}
return sum.toFixed(2);
});
return model;
}
//Apply MappingOptions
var AppViewModel = ko.mapping.fromJS(data, mappingOptionsForTotalShiftExpenses);
$(document)
.ready(function() {
ko.applyBindings(AppViewModel);
});
С выше кодой я могу получить - первая входную коробку для первого элемента расхода - После того, как я добавляю статьи расходов, он покажет другое поле ввода, установленное для следующего элемента, а также отобразит общее количество. - Проблема заключается в том, когда я пытаюсь добавить второй расход, который он ничего не запускает (кажется, что 2-й набор полей ввода не наблюдается). Однако, если я сделаю изменение суммы в первом расходном элементе, это вызовет наблюдаемое поведение и правильно добавит элементы для обоих expesnse .. и добавит поля ввода пользовательского интерфейса для 3-го расхода. По какой-то причине всегда последнее поле ввода не вызывает наблюдаемое поведение, но любое поле перед последним будет делать. Примечание. Код, который я опубликовал, только пытается добавить сумму расходов.
Отчаянно ожидая услышать от эксперта по нокауту .... большое спасибо заранее.
Большое спасибо за вашу помощь. Однако то, что вы опубликовали, уже работает для меня. Моя проблема заключается в том, чтобы добавить динамические поля ввода и получить их общее количество. Не могли бы вы добавить эту функциональность в свое решение. Большое спасибо. –
Ответ был обновлен, чтобы включить динамическое добавление и удаление элементов формы, когда пользователь вводит данные. –
Спасибо, миллион. На самом деле я не могу сказать Спасибо. Я отметил это как ответ. Если вы можете добавить небольшое обновление, я по достоинству оценят его. Если вы можете сделать так, описание должно быть введено до того, как сумма будет введена. –