Je voudrais push
un nouvel élément sur un observableArray
, mais seulement si l’élément n’est pas déjà présent. Y at-il une fonction “trouver” ou un modèle recommandé pour y parvenir dans KnockoutJS?
J’ai remarqué que la fonction remove
sur un observableArray
peut recevoir une fonction pour passer dans une condition. Je veux presque les mêmes fonctionnalités, mais seulement si la condition passée est ou n’est pas vraie.
Un observableArray expose une fonction indexOf
(wrapper à ko.utils.arrayIndexOf
). Cela vous permet de faire:
if (myObservableArray.indexOf(itemToAdd) < 0) { myObservableArray.push(itemToAdd); }
Si les deux ne sont pas une référence au même object et que vous souhaitez exécuter une logique de comparaison personnalisée, vous pouvez utiliser ko.utils.arrayFirst
comme:
var match = ko.utils.arrayFirst(myObservableArray(), function(item) { return itemToAdd.id === item.id; }); if (!match) { myObservableArray.push(itemToAdd); }
Merci RP. Voici un exemple d’utilisation de votre suggestion pour renvoyer la propriété ‘name’ via la propriété ‘id’ de l’object depuis mon modèle de vue.
self.jobroles = ko.observableArray([]); self.jobroleName = function (id) { var match = ko.utils.arrayFirst(self.jobroles(), function (item) { return item.id() === id(); //note the () }); if (!match) return 'error'; else return match.name; };
En HTML, j’ai les éléments suivants ($ parent est dû au fait que cela se trouve dans une boucle de ligne de tableau):
rechercher un object dans un ko.observableArray
function data(id,val) { var self = this; self.id = ko.observable(id); self.valuee = ko.observable(val); } var o1=new data(1,"kamran"); var o2=new data(2,"paul"); var o3=new data(3,"dave"); var mysel=ko.observable(); var combo = ko.observableArray(); combo.push(o1); combo.push(o2); combo.push(o3); function find() { var ide=document.getElementById("vid").value; findandset(Number(ide),mysel); } function indx() { var x=document.getElementById("kam").selectedIndex; alert(x); } function getsel() { alert(mysel().valuee()); } function findandset(id,selected) { var obj = ko.utils.arrayFirst(combo(), function(item) { return id=== item.id(); }); selected(obj); } findandset(1,mysel); ko.applyBindings(combo);
J’appendais “valueWillMutate ()” avant les changements et “valueHasMutated ()” après eux.
for (var i = 0; i < data.length; i++) { var needChange = false; var itemToAdd = data[i]; var match = ko.utils.arrayFirst(MyArray(), function (item) { return (itemToAdd.Code === item.Code); }); if (!match && !needChange) { MyArray.valueWillMutate(); needChange = true; } if (!match) { MyArray.push(itemToAdd); } } if (needChange) { MyArray.valueHasMutated(); }