在我的淘汰视图中,我没有得到所有的价值。
这是我的脚本文件:
parent="Theme.AppCompat.Light.DarkActionBar"
这是我的观点:
android:background="#EE6C00"
问题是它只在视图中显示var ViewModel = function () {
var self = this;
self.games = ko.observableArray();
self.error = ko.observable();
self.detail = ko.observable();
var gamesUri = '/api/games/';
self.getGameDetail = function (item) {
ajaxHelper(gamesUri + item.Id, 'GET').done(function (data) {
self.detail(data);
});
console.log(self.detail);
};
function ajaxHelper(uri, method, data) {
self.error('');
return $.ajax({
type: method,
url: uri,
dataType: 'json',
contentType: 'application/json',
data: data ? JSON.stringify(data) : null
}).fail(function (jqXHR, textStatus, errorThrown) {
self.error(errorThrown);
});
}
function getAllGames() {
ajaxHelper(gamesUri, 'GET').done(function (data) {
self.games(data);
});
}
getAllGames();
};
ko.applyBindings(new ViewModel());
。 <div class="row">
<div class="col-md-4">
<div class="panel panel-default">
<div class="panel-heading">
<h2 class="panel-title">Games</h2>
</div>
<div class="panel-body">
<ul class="list-unstyled" data-bind="foreach: games">
<li>
<strong><span data-bind="text: DeveloperName"></span>:<span data-bind="text: Title"></span></strong>
<small><a href="#" data-bind="click: $parent.getGameDetail">Details</a></small>
</li>
</ul>
</div>
</div>
<div class="alert alert-danger" data-bind="visible: error"><p data-bind="text: error"></p></div>
</div>
<div class="col-md-4">
<div class="panel panel-default">
<div class="panel-heading"><h2 class="panel-title">Details</h2></div>
</div>
<table class="table">
<tr><td>Developer</td><td data-bind="text: detail().DeveloperName"></td></tr> //Only this value is displayed
<tr><td>Title</td><td data-bind="text: detail().Title"></td></tr>
<tr><td>Price</td><td data-bind="text: detail().Price"></td></tr>
<tr><td>Genre</td><td data-bind="text: detail().Genre"></td></tr>
<tr><td>Year</td><td data-bind="text: detail().Year"></td></tr>
</table>
</div>
<div class="col-md-4">
</div>
</div>
,DeveloperName
,Title
和Price
未在视图中显示。我尝试了很多东西,但我不知道错误在哪里。
答案 0 :(得分:0)
有两种方法。
最简单的方法是使用with
或template
绑定。该技术类似,但我将展示with
绑定的示例:
<table class="table" data-bind="with: details">
<tr><td>Developer</td><td data-bind="text: DeveloperName"></td></tr>
<tr><td>Title</td><td data-bind="text: Title"></td></tr>
<tr><td>Price</td><td data-bind="text: Price"></td></tr>
<tr><td>Genre</td><td data-bind="text: Genre"></td></tr>
<tr><td>Year</td><td data-bind="text: Year"></td></tr>
</table>
使用此技术,每当您更改details
observable中的对象时,新值将应用于具有with
绑定的elment内的子元素。在这种情况下,table
元素内的所有元素。此外,语法更短,更清晰。 注意:如果您需要绑定与$parent
绑定的对象之外的内容,则必须使用$parents[]
,$root
或with
。
最难的一个,只有在你的viewmodel更复杂并且例如计算了observable时才需要,你需要创建一个属性也是可观察对象的对象。在这种情况下,您将绑定此对象一次,并在下一次更新innser obervable属性,而不是更改对象本身。
对于您的示例,您必须创建一个具有所有属性的对象,例如DeveloperName
,Title
,Price
等定义为observables。然后,您必须将AJAX恢复的值映射到此属性,您可以手动执行,执行details().DeveloperName(newDetails.DeveloperName)
等操作,或使用ko.mapping插件。
重要说明:如果使用此技术,则必须保留原始details
绑定对象,并更新其属性。如果用新的details
对象替换 str = "Tom Coulomb"
str = str.replace(/ /g,".")+"@gmail.com"
// Tom.Coulomb@gmail.com
对象,则绑定将丢失,并将根据需要停止工作。
另一个注意事项:您不能将cleanNodes用于您的想法。请参阅this Q&A。