선택 목록이 올바른 옵션을 선택하여 렌더링되지 않습니다. 필자는 선택된 관측 값 (this.selected = ko.computed (parseInt (selected(), 10) == this.id;)을 계산하고 배열 함수에서 찾기 등 여러 가지 방법으로 시도했습니다.편집 모드로 전환 할 때 원래의 값을 어떻게 선택합니까?
프로덕션 환경에서 dataArea 요소는 서버 측 데이터로 채워집니다. div를 "data-"속성과 함께 사용하면 서버 측과 클라이언트 측 스크립팅이 분리되어 있습니다 (디자이너에게 도움이됩니다).
편집 버튼을 클릭하여 편집 할 옵션이있는 레코드가 먼저 비 편집 모드로 표시됩니다. 편집 모드에서는 레코드의 초기 값이 입력 컨트롤에 나타납니다. 다른 고객을 선택하고 양식에 새 연관된 프로젝트를로드하도록하는 옵션이 있습니다. 새 고객을로드하면 예상대로 프로젝트 목록이 재설정됩니다.
새로운 고객을로드하는 중에 문제가 발생하는 현재 값을 편집하는 것으로 전환하는 동안 문제가 발생합니다. 선택한 프로젝트가 드롭 다운 목록에 나타나야합니다. 새로운 고객이 선택되면 목록에는 새 옵션이 채워지고 기본값은 필요하지 않습니다.
http://jsfiddle.net/mathewvance/ZQLRx/
* 원래 샘플 http://jsfiddle.net/mathewvance/wAGzh/ *
감사 (무시하십시오).
<p>
issue: When the select options are read, the inital value gets reset to the first object in the options. How do I keep the original value selected when transitioning to edit mode?
</p>
<div>
<h2>Edit Quote '1001'</h2>
<div class="editor-row" data-bind="with: selectedCustomer">
<label>Customer</label>
<div data-bind="visible: !$root.isEditMode()">
<span data-bind="text: CompanyName"></span>
</div>
<div data-bind="visible: $root.isEditMode()">
<input type="radio" name="customerGroup" value="1" data-bind="value: id"> Company Name 1
<input type="radio" name="customerGroup" value="2" data-bind="value: id"> Company Name 2
</div>
</div>
<div class="editor-row">
<label>Project</label>
<div data-bind="visible: !isEditMode()">
<span data-bind="text: selectedProject.Name"></span>
</div>
<div data-bind="visible: isEditMode()">
<select data-bind="options: selectedCustomer().projects, optionsText: 'Name', value: selectedProject"></select>
</div>
</div>
<div>
<button data-bind="click: function() { turnOnEditMode() }">Edit</button>
<button data-bind="click: function() { turnOffEditMode() }">Cancel</button>
</div>
</div>
<hr/>
<div data-bind="text: ko.toJSON($root)"></div>
function ajaxCallGetProjectsByCustomer(customerId) {
var database = '[{"CustomerId": 1, "Name":"Company Name 1", "Projects": [ { "ProjectId": "11", "Name": "project 11" }, { "ProjectId": "12", "Name": "project 12" }, { "ProjectId": "13", "Name": "project 13" }] }, {"CustomerId": 2, "Name": "Company Name 2", "Projects": [ { "ProjectId": "21", "Name": "project 21" }, { "ProjectId": "22", "Name": "project 22" }, { "ProjectId": "23", "Name": "project 23" }] }]';
var json = ko.utils.parseJson(database);
//console.log('parseJson(database) - ' + json);
//ko.utils.arrayForEach(json, function(item) {
// console.log('CustomerId: ' + item.CustomerId);
//});
return ko.utils.arrayFirst(json, function(item){
return item.CustomerId == customerId;
});
}
var Customer = function(id, name, projects) {
var self = this;
this.id = ko.observable(id);
this.CompanyName = ko.observable(name);
this.projects = ko.observableArray(ko.utils.arrayMap(projects, function(item) {
return new Project(item.ProjectId, item.Name);
}));
};
Customer.load = function(id) {
var data = ajaxCallGetProjectsByCustomer(id);
var customer = new Customer(
data.CustomerId,
data.Name,
data.Projects);
};
var Project= function(id, name) {
this.id = id;
this.Name = ko.observable(name);
};
var QuoteViewModel = function() {
var self = this;
$customerData = $('#customerData'); // data from html elements
$projectData = $('#projectData');
// intial values to display from html data
var customer = new Customer (
$customerData .attr('data-id'),
$customerData .attr('data-companyName'),
[{"ProjectId": $projectData .attr('data-id'), "Name": $projectData .attr('data-name')}]
)
this.selectedCustomer = ko.observable(customer);
this.selectedProject = ko.observable($projectData.attr('data-id'));
this.isEditMode = ko.observable(false);
this.selectedCustomer.subscribe(function(){
// todo: load customer projects from database api when editing
});
this.turnOnEditMode = function() {
var customerId = self.selectedCustomer().id();
console.log('customerId: ' + customerId);
Customer.load(customerId);
self.isEditMode(true);
};
this.turnOffEditMode = function() {
self.isEditMode(false);
};
};
var viewModel = new QuoteViewModel();
ko.applyBindings(viewModel);
당신이하려는 것을보기가 정말로 어렵습니다. 편집 버튼을 클릭 할 때마다 thingamabob을 다시로드합니까? jquery dom 물건이 필요한 이유를 이해하지 못합니다. 아마도이 문제와 관련이 없습니다. 무슨 일이 일어나는지 정확히 설명해 주시겠습니까? – madcapnmckay
좀 더 자세한 설명을 추가했습니다. 목표는 읽기 전용 모드로 레코드를 표시하고 필요할 때 서버에서 컨트롤에 관련 데이터를로드 할 수있는 옵션이있는 옵션을 사용하는 것입니다. 정식 버전에서는 다른 thingamabob을 선택하는 옵션이 있지만 문제는 초기 값을 편집하는 것만으로 모든 데모가 수행됩니다. –