プレイヤー名と ID で並べ替えるための 2 つのボタンがあります。のような並べ替えごとに2つの関数を使用しています。
<ul data-bind="template: { name: 'playerstmpl', foreach: players }"></ul>
<hr/>
<button data-bind="click: sortbyPlayer">Sort by Player</button>
<button data-bind="click: sortbyId">Sort by Id</button>
<script id="playerstmpl" type="text/html">
<li> <span data-bind = "text: id"> </span>
<input data-bind="value: FirstName" /> </li>
</script>
<script type="text/javascript">
function Player(id, name) {
return {
id: ko.observable(id),
FirstName: ko.observable(name)
};
}
var viewModel = {
players: ko.observableArray([
new Player(64, "Yuvi"),
new Player(22, "Gayle"),
new Player(91, "Adam"),
new Player(19, "Flintoff"),
new Player(56, "Malinga")])
};
viewModel.sortbyPlayer = function () {
var unsorted = viewModel.players();
viewModel.players(unsorted.sort(viewModel.sortFunction = function (a, b) {
return a.FirstName().toLowerCase() < b.FirstName().toLowerCase() ? -1 : 1;
}));
};
viewModel.sortbyId = function () {
var unsortedId = viewModel.players();
viewModel.players(unsortedId.sort(viewModel.sortFunction = function (a, b) {
return a.id() < b.id() ? -1 : 1;
}));
};
ko.applyBindings(viewModel);
</script>
2 つの関数を 1 つにマージできるように、関数で渡されるプロパティを見つけようとしています。
viewModel.sortbyPlayer = function () {
var unsorted = viewModel.players();
viewModel.players(unsorted.sort(viewModel.sortFunction = function (a, b) {
if (Player[a] == "FirstName") { // is string
return a.FirstName().toLowerCase() < b.FirstName().toLowerCase() ? -1 : 1;
}
else {
return a.id() < b.id() ? -1 : 1;
}
}));
};
とにかく1つの関数で並べ替えを行うことはありますか..ありがとう