【发布时间】:2012-03-13 09:13:50
【问题描述】:
选择列表未在选择正确选项的情况下呈现。我已经尝试了多种不同的方法,包括计算选择的 observable (this.selected = ko.computed(return parseInt(selected(), 10) == this.id; )) 并在数组函数中查找。
在生产中,dataArea 元素将填充服务器端数据。使用带有“data-”属性的 div 可以将服务器端和客户端脚本分开(我发现这有助于设计人员)。
记录将首先以非编辑模式显示,并带有通过单击编辑按钮进行编辑的选项。在编辑模式下,记录的初始值出现在输入控件中。您可以选择说,选择另一个客户并让表单加载新的关联项目。加载新客户将按预期重置项目列表。
因此,虽然加载新客户效果很好,但转换到编辑当前值会导致问题。所选项目需要出现在下拉列表中。如果选择了新客户,列表中会填充新选项并且不需要默认值。
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 的东西,也许这与问题无关。你能准确解释你会发生什么吗?
-
我添加了更多解释。目标是以只读模式显示记录,并可选择就地编辑,并在需要时将相关数据从服务器加载到控件中。选择不同的 thingamabob 是完整版中的一个选项,但我的问题只是编辑初始值,这就是演示的全部内容。
标签: javascript data-binding mvvm viewmodel knockout.js