Привет, я много часов искал в Интернете, пытаясь решить это, но я не мог найти решение.Отображение нокаута Наблюдаемый массив MVC
Я создаю решение с помощью ASP.NET MVC и нокаута. Контроллер возвращает параметры, которые пользователь может выбрать для представления, которое преобразует его в JSON, и использует плагин отображения для сопоставления его с нокаутом View Model. Он заполняется правильно, потому что, когда я это делаю: ko.toJSON ($ data), чтобы проверить его, вернутся правильные данные, но представление не будет обновлять список, когда элемент будет добавлен к нему.
Я предполагаю, что свойства не являются наблюдаемыми, но я не уверен, как это исправить.
Это пример JSON Возвращается:
[{ "Key": 1, "Значение": "Компания"}]
Это мой JavaScript:
function ProjectWorkedOn() {
var self = this;
self.client = ko.observable();
self.job = ko.observable();
self.project = ko.observable();
self.workType = ko.observable();
}
function createTimesheetViewModel() {
var self = this;
//list of options
self.UserClients = ko.observableArray();
self.UserProjects = ko.observableArray();
self.UserJobs = ko.observableArray();
self.UserWorkTypes = ko.observableArray();
//keep track of selected options
self.selectedClient = ko.observable();
self.selectedProject = ko.observable();
self.selectedJob = ko.observable();
self.selectedWorkType = ko.observable();
//list to add choices in
self.ListProjectsWorkedOn = ko.observableArray();
self.addProjectWorkedOn = function() {
var project = new ProjectWorkedOn();
project.client = self.selectedClient;
project.job = self.selectedJob;
project.project = self.selectedProject;
project.workType = self.selectedWorkType;
self.ListProjectsWorkedOn.push(project)
}
self.removeProjectWorkedOn = function (projectWorkedOn) {
self.ListProjectsWorkedOn.remove(projectWorkedOn)
}
}
$(function() {
var CreateTimesheetViewModel = new createTimesheetViewModel();
CreateTimesheetViewModel.UserClients = ko.mapping.fromJSON('@Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model.UserClients))');
CreateTimesheetViewModel.UserProjects = ko.mapping.fromJSON('@Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model.UserProjects))');
CreateTimesheetViewModel.UserJobs = ko.mapping.fromJSON('@Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model.UserJobs))');
CreateTimesheetViewModel.UserWorkTypes = ko.mapping.fromJSON('@Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model.UserWorkTypes))');
ko.applyBindings(CreateTimesheetViewModel, document.getElementById("CreateTimesheet"));
});
Это часть вида, который добавляет элементы в список:
<table>
<tr>
<td>
Projects Worked On:
</td>
<td>
Client: <select data-bind="options: UserClients, optionsText: 'Value', value: selectedClient"></select>
</td>
<td>
Project: <select data-bind="options: UserProjects, optionsText: 'Value', value: selectedProject"></select>
</td>
<td>
Job: <select data-bind="options: UserJobs, optionsText: 'Value', value: selectedJob"></select>
</td>
<td>
Service: <select data-bind="options: UserWorkTypes, optionsText: 'Value', value: selectedWorkType"></select>
</td>
<td>
<button data-bind="click: addProjectWorkedOn">Add Project</button>
</td>
</tr>
</table>
и это то, что показывает их:
<table>
<tr>
<td>Client</td>
<td>Project</td>
<td>Job</td>
<td>Service</td>
<td></td>
</tr>
<tbody data-bind="foreach: ListProjectsWorkedOn()">
<tr>
<td data-bind="text: client.Value"></td>
<td data-bind="text: project.Value"></td>
<td data-bind="text: job.Value"></td>
<td data-bind="text: workType.Value"></td>
<td><button data-bind="click: $parent.removeProjectWorkedOn">Remove</button></td>
</tr>
</tbody>
</table>
Заранее благодарен!
EDIT:
Я работал его
добавить проект установки атрибутов, как это: project.clientValue (. Self.selectedClient() Value);
затем ссылаться на них с точки зрения называть его как функцию: clientValue()
Заслуга Прэтт для объяснения, что наблюдаемые следует называть как функции, если вы хотите, чтобы получить их значение
спасибо, я пробовал это, но он все еще не отображает значения. Список показывает, и он увеличивается в размере, но каждое из значений, которые он связывает, пуст. –
странно, что я могу добавлять и удалять, но он просто не отображает данные. –
Я только что изменил его на пару значений ключа, но в любом случае кажется, что он должен работать, потому что список заполнялся, когда я добавлял новые элементы , Единственная проблема заключалась в том, что он просто не обновил бы ту часть представления, которая была привязана к ней. –