データの変更に基づいて何かをレンダリングする必要があるこの種の状況に遭遇するたびに、データとビュー レイヤーの分離を検討してください。データの変更ごとにビューを変更する必要があるためです。この種のロジックを独自に実装することも、この種の問題を解決しようとする Angular.js、Backbone.js、Ember.js などのフレームワークを使用することもできます。あなたの場合、問題を解決する方法はいくつかありますが、前に述べたように、デカップリングの方が良いでしょう (私は思います)。次のようなことができます
変更された HTML (データを簡単に抽出するため)。元の HTML を保持できますが、データをプルするロジックを変更する必要があります。
Sort data by:
<a href="#">Date</a> <a href="#">Name</a>
<br />
<br />
<form id="live-search" action="" class="styled" method="post">
<fieldset>
<input type="text" class="text-input" id="filter" value="Date" />
<br />
<input type="text" class="text-input" id="filter2" value="Name" />
<br /> <span id="filter-count"></span>
</fieldset>
</form>
<ul class="records2" id="records">
<div data-record='{"year": "2012","name":"Joe"}'>
<li>2012</li>
<li>Joe</li>
</div>
<br />
<div data-record='{"year": "2013","name":"Dave"}'>
<li>2013</li>
<li>Dave</li>
</div>
<br />
<div data-record='{"year":"2013","name":"Adam Brown"}'>
<li>2013</li>
<li>Adam Brown</li>
</div>
function sortArray(arr, prop, asc)
{
arr = arr.sort(function(a, b)
{
if (asc)
{
return (a[prop] > b[prop]);
}
else
{
return (b[prop] > a[prop]);
}
});
return arr;
}
$(document).ready(function ()
{
var recordDiv = $('#records'), dataDivs = $('#records div'), data = [], sortLink = $('a');
for (var i = 0, len = dataDivs.length; i < len; i++)
{
var t = $(dataDivs[i]).attr('data-record');
t = $.parseJSON(t);
data.push(t);
}
sortLink.click(function()
{
var sortBy = this.innerHTML.toLowerCase();
data = sortArray(data, sortBy, true);
//Now render the element inside #record DIV as per sorted data
return false;
});
});
それがどうなるか教えてください。:)