我是新來javascript/jquery和我正在學習knockoutjs。我被困在這個問題上。我的頁面中有兩個ko綁定。第一個創建用戶點擊的鏈接,以查看有關該項目的更多信息。該鏈接包含一個傳遞給ajax調用的ID,該調用將數據返回給第二個可觀察值。Knockoutjs綁定後用戶點擊鏈接
問題是第二個可觀察數據總是在頁面上顯示爲'undefined'。但是,如果我在創建observable的代碼中放置console.log(data),那麼數據就在那裏。同樣,在Fiddler中,ajax調用請求的json正在被髮回。我敢肯定這與我如何綁定可觀察對象有關,但我嘗試了幾種不同的方法(使用數組,而不是數組等),並且無濟於事。任何幫助或指針將不勝感激。似乎是一個簡單的問題,但我已經竭盡所能,並無法得到它的工作...
$(document).ready(function() {
var da = new firstViewModel();
ko.applyBindings(da, document.getElementById('da'));
var eq = new secondViewModel();
//Binding the second observable here but not using it yet as it depends on getting data from the //first (da) in order to work.
ko.applyBindings(eq, document.getElementById('eqdetails'));
});
function da(data) {
var self = this;
self.eqid = ko.observable(data.eqid);
self.modelname = ko.observable(data.modelname);
}
function firstViewModel() {
// Data
var self = this;
self.da = ko.observableArray([]);
self.getdetails = function (da) {
selectedid = da.eqid();
//Call second observable when user clicks on link.
var eq = new secondViewModel();
eq.geteqdetails();
}
};
};
function eqview(data) {
console.log('in eqview ' + data); //This works, but data is still undefined in html
var self = this;
self.modelname = ko.observable(data.modelname);
self.number = ko.observable(data.number);
};
function secondViewModel() {
var self = this;
self.eqviews = ko.observableArray([]);
self.geteqdetails = function() {
$.ajax("../Process/GetEqDetails", {
type: "post",
contentType: "application/json",
data: JSON.stringify({ EqID: selectedid }),
success: function (result) {
console.log('in ajax call ' + result.data);
var mappedequipmentview = $.map(result, function (item) { return new eqview(item) });
self.eqviews(mappedequipmentview);
}
});
};
這裏是頁面的HTML:
<div id="da" class="span3">
<table class="table table-bordered table-striped table-condensed">
<thead>
<tr>
<th>Model</th>
<th>ID</th>
</tr>
</thead>
<tbody data-bind="template: { name: 'datemplate', foreach: da }">
</tbody>
</table>
<script id="datemplate" type="text/html">
<tr>
<td><span data-bind="text: modelname"></span></td>
<td>
<button type="button" class="btn btn-link" data-bind="click: $root.getdetails" title="View">
<span data-bind="text: eqid"></span></button>
</td>
</tr>
</script>
</div>
<div class="span6">
<div class="span1">
<table class="table table-bordered table-condensed" id="eqdetails">
<tbody >
<tr>
<td><span data-bind="text: $data.modelname "></span></td>
</tr>
<tr>
<td><span data-bind="text: $data.number "></span></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
這裏有一個未經測試的理論......使用'new secondViewModel()'將會生成一個新的secondViewModel實例,但它永遠不會替換你已經綁定的實例。在'firstViewModel'中放置'ko.applyBindings(eq,document.getElementById('eqdetails'));'var eq = new secondViewModel();'語句下面會發生什麼? – Jorg
不幸的是,這並沒有奏效。我遇到了同樣的問題,'eqview函數'中的'console.log'工作正常,但在頁面上我得到'undefined'。感謝您的建議。 – vbuser2004