我有一個淘汰賽視圖模型得到從JSON調用填充。 在的形式的選擇元件,我有一組選項(也來自視圖模型來),並且值的observableArray
一部分。 問題僅在於select元素而不是輸入值 - 提交表單時,只有在select中分配的值才包含正確的值。因此,從JSON成功加載並以表單呈現但保持不變的那些將作爲options數組中的第一個值發送回服務器。knockout.js選擇元件結合失去後續形式提交值
HTML形式:
<form>
<table >
<thead>
...
</thead>
<tbody data-bind='foreach: ScaledCostEntries'>
<tr>
<td><input data-bind='value: StartDateString' class="startdate" type="text"/></td>
<td><select data-bind='value: InvoiceType, options: $root.InvoiceTypes'></select></td>
<td><a href='#' data-bind='click: $root.removeCost'>Delete</a></td>
</tr>
</tbody>
</table>
<button data-bind='click: addCost'>Add New Row</button>
<button data-bind='click: save' >Update</button>
</form>
在上面的問題這個代碼是與InvoiceType,所述的ViewModels ScaledCostEntries
observableArray的一部分。 (另外,如果我交換值和選項的順序,那麼不會在select元素中放入選定的值)。
和JS:
<script type="text/javascript">
$(function() {
var scaledCostModel = function() {
var self = this;
self.ScaledCostEntries = ko.observableArray([]);
self.InvoiceTypes = ko.observableArray([]);
self.addCost = function() {
self.ScaledCostEntries.push({
StartDateString: ko.observable(),
InvoiceType: ko.observable()
});
};
self.removeCost = function (cost) {
cost.IsDeleted = true;
self.ScaledCostEntries.destroy(cost);
};
self.save = function (form) {
jQuery.ajax({
url: '@Request.Url.PathAndQuery',
type: "POST",
dataType: "json",
contentType: "application/json; charset=utf-8",
data: ko.toJSON(self.ScaledCostEntries)
});
};
};
jQuery.getJSON('@Request.Url.PathAndQuery', function (data) {
ko.mapping.fromJS(data, {}, viewModel);
});
var viewModel = new scaledCostModel();
ko.applyBindings(viewModel);
});
</script>
因此,要總結,這個問題是綁定到select元素視圖模型的財產。當選擇保持不變(未重新選擇)時,視圖模型將其值作爲選項(InvoiceTypes
)數組中的第一項發送到服務器時的值。最後,我可能會忘記一些微不足道的東西,這是我第一次更加認真的淘汰賽。
注意:InvoiceType
是ScaledCostEntries
的一部分,它是observableArray
。 InvoiceTypes
是observableArray
。 兩個InvoiceTypes
和ScaledCostEntries
,來自JSON和ScaledCostEntries
送回。
你可以把Chrome或其他瀏覽器的調試器的暫停在Ajax調用的開始,看到的是在該self.ScalsedCostEntries陣列? – zmanc 2013-03-20 14:16:02
@zmanc:是的,已經做到了。如果我重新選擇了它們,值就很好。如果我沒有做任何事情來形成或重新選擇另一行的值,那麼未編輯的將包含select選項中的第一個元素--InvoiceTypes [0]。 – 2013-03-20 14:19:51