绑定可观察的子属性时,未在View中获取所有值

时间:2015-11-02 12:30:28

标签: javascript mvvm knockout.js

在我的淘汰视图中,我没有得到所有的价值。

这是我的脚本文件:

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> DeveloperNameTitlePrice未在视图中显示。我尝试了很多东西,但我不知道错误在哪里。

1 个答案:

答案 0 :(得分:0)

有两种方法。

最简单的方法是使用withtemplate绑定。该技术类似,但我将展示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[]$rootwith

最难的一个,只有在你的viewmodel更复杂并且例如计算了observable时才需要,你需要创建一个属性也是可观察对象的对象。在这种情况下,您将绑定此对象一次,并在下一次更新innser obervable属性,而不是更改对象本身。

对于您的示例,您必须创建一个具有所有属性的对象,例如DeveloperNameTitlePrice等定义为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