dans mon application MVC im la création de plusieurs Dropdowns en suivant:Event Knockout incendies deux fois
<select data-bind="options: findGroup(1).items(),
optionsText: 'country',
optionsValue: 'id',
value: selectedItem(1),
event: { change: selectionChange }"></select>
la findGroup (x) et le selectedItem (x) sont des fonctions globales dans mon ViewModel alors que ceux-ci sont pour tous les menus déroulants du même. L'option selectedItem (x) doit renvoyer l'option actuellement sélectionnée de la liste déroulante
. selectedItem (x) est une fonction permettant de renvoyer un knock-out calculé.
Maintenant, je suis confronté au problème que l'événement selectionChange est déclenché deux fois. Voir ce violon pour un exemple: http://jsfiddle.net/LGveR/20/ Dans cet exemple, si vous modifiez la valeur de la zone de liste déroulante, vous pouvez voir que l'événement selectionCahnge est déclenché deux fois.
Quand je laisse la valeur: selectedItem (x) sur (et donc pas de fonction calculée dans le code), il ne marche pas: voir: http://jsfiddle.net/LGveR/21/
Je pense que la deuxième fois que l'événement est tiré vient du fait que dans la fonction calculée selectedItem (x) l'observable
grp.selectedItem(grp.findItemByValue(value));
est activé. Comment empêcher que le paramétrage de cet observable mène à un événement "Change"?
TIA, Paul
HTML:
<select data-bind="options: findGroup(1).items(),
optionsText: 'country',
optionsValue: 'id',
value: selectedItem(1),
event: { change: selectionChange }"></select> <span data-bind="text: 'aantal: ' + findGroup(1).items().length"></span>
<br /> <span data-bind="text: 'Group Selected Country: ' + findGroup(1).selectedItem().country"></span>
<br /> <span data-bind="text: 'Computed Selected Country: ' + selectedItem(1)().country"></span>
<br /> <span data-bind="text: 'after select: ' + counter()"></span>
<br />
Javascript:
var group = function (id) {
this.id = id;
this.items = ko.observableArray() || {};
this.selectedItem = ko.observable();
this.addItem = function (data) {
this.items.push(data);
};
this.findItemByValue = function (id) {
return ko.utils.arrayFirst(this.items(), function (item) {
return item.id === id;
});
}
};
var grpItem = function (id, country) {
this.id = id;
this.country = country;
};
var ViewModel = function() {
this.groups = ko.observableArray() || {};
this.counter = ko.observable(0);
this.selectionChange = function (data, event, selector, item) {
this.counter(this.counter() + 1);
};
this.addGrp = function (data) {
this.groups.push(data);
};
this.findGroup = function (groupId) {
var ret = ko.utils.arrayFirst(this.groups(), function (c) {
return c.id === groupId;
});
return ret;
};
this.selectedItem = function (groupId) {
var grp = this.findGroup(groupId);
return ko.computed({
read: function() {
return this.findGroup(groupId).selectedItem();
},
write: function (value) {
grp.selectedItem(grp.findItemByValue(value));
}
}, this);
};
};
var vm = new ViewModel();
var p = new group(1);
var a = new grpItem(1, 'holland');
var b = new grpItem(2, 'germany');
var c = new grpItem(3, 'brasil');
p.addItem(a);
p.addItem(b);
p.addItem(c);
vm.addGrp(p);
ko.applyBindings(vm);
je ne peux pas voir une fonction calculée dans votre code –
@Jeroen, je vais ajouter le code pour une utilisation future. Malheureusement dans mon violon (Chrome) je ne fais face à aucune erreur dans la console: S ... – Paul
@johnSmith, le deuxième violon n'a pas été calculé, pour démontrer que la valeur de liaison de données: selectedItem (x) "corrompt" le code .. – Paul