J’utilise le code ci-dessous pour gérer la fonctionnalité de sorting. Ça marche pour moi. Mais existe-t-il un moyen de rendre le code aussi commun et je peux donc l’utiliser à tout moment?
<span class="sorting" data-bind="click: function(){ ui.items.sort(function(a,b){ return a.Username User Name <span class="sorting" data-bind="click: function(){ ui.items.sort(function(a,b){ return a.Firstname First Name <span class="sorting" data-bind="click: function(){ ui.items.sort(function(a,b){ return a.Lastname Last Name
des scripts
ui = new ListUI(config); ko.applyBindings(ui); var ListUI = function ListUIF(config) { this.items = ko.observableArray([]); } var item = function itemF(data) { var self = this; self.Username = ko.observable(data.Username); self.Firstname = ko.observable(data.Firstname); self.Lastname = ko.observable(data.Lastname); }
Le code ci-dessus fonctionne bien, mais je ne voulais pas que le code de sorting soit répété.
<span class="sorting" data-bind="click: function(){ ui.items.sort(function(a,b){ return a.Lastname Last Name
Au lieu de cela, je veux quelque chose comme ça
Last Name var sortFunction = function sortFunctionF(a, b){ return a.Username < b.Username : -1 : 1; //How to make this common for other property also like Firstname, Lastname etc. }
Il existe essentiellement deux options: avoir trois fonctions sortByUsername
, sortByUsername
, sortByFirstname
et sortByLastname
, ou vous pouvez sortByLastname
une liaison personnalisée qui prend des informations supplémentaires et configure le sorting.
Le second pourrait ressembler à quelque chose comme ça:
User Name First Name Last Name
Et puis la liaison personnalisée pour sortFunction:
ko.bindingHandlers.sortFunction = { update: function(element, valueAccessor, allBindingsAccessor, viewModel) { var sortBy = ko.utils.unwrapObservable(valueAccessor()); var items = viewModel.items; $(element).unbind('click.sort').bind('click.sort', function() { items.sort(function(a, b) { return a[sortBy]() < b[sortBy]() ? -1 : 1; }); }); } }
Violon
Une autre option mentionnée par Joeseph serait de passer le nom de la propriété à la fonction click, qui renverrait alors une fonction. Je ne pense pas que ce soit une option aussi intéressante que la reliure personnalisée, mais voici un violon qui fait cela:
User Name First Name Last Name
Et puis votre modèle de vue changerait pour append la fonction:
var ListUI = function ListUIF(items) { var self = this; self.items = ko.observableArray(items); self.getSortFunction = function(prop) { return function() { self.items.sort(function(a, b) { return a[prop]() < b[prop]() ? -1 : 1; }); }; }; return self; }