Ho un gruppo di caselleCome implementare dipendenze casella di controllo knockoutjs
- casella A
- casella B
- casella C
generata con l'associazione dati foreach:
<input type="checkbox" data-bind="value: id, checked: $root.chkboxSelected" />
Quali prendono il loro stato controllato da un array osservabile. Quindi controllando una casella si aggiungerà il valore corrispondente all'array, knockoutjs standard che funziona bene. Poi ho voluto aggiungere una semplice regola:
se C è selezionato, quindi anche A e B devono essere controllati.
Qual è il modo più pulito per aggiungere questo tipo di logica in knockoutjs? Ho provato con uno scrivibile calcolabile osservabile:
var viewModel = {
foo: observableArray(),
..
};
viewModel.chkboxSelected = ko.computed({
read: function() {
return this.foo();
},
write: function(value){
//add it if not added already
if($.inArray(value, this.foo()) < 0) {
this.foo.push(value);
}
// if C is present then A,B must be as well
if($.inArray("C", this.foo()) >= 0) {
if($.inArray("B", this.foo()) < 0) {
this.foo().push("B");
}
if($.inArray("A", this.foo()) < 0) {
this.foo().push("A");
}
}
},
owner: viewModel
});
Mettere un punto di interruzione sulla lettura e funzioni di scrittura: leggo viene chiamato e la pagina viene caricata bene. Tuttavia, quando ho quindi fare clic su qualsiasi casella di controllo ottengo il seguente errore (il punto di interruzione di scrittura non viene colpito):
knockout-2.0.0.debug.js:2297
Uncaught TypeError: Object function dependentObservable() {
if (arguments.length > 0) {
if (typeof options["write"] === "function") {
// Writing a value
var valueForThis = options["owner"] || evaluatorFunctionTarget; // If undefined, it will default to "window" by convention. This might change in the future.
options["write"].apply(valueForThis, arguments);
} else {
throw "Cannot write a value to a dependentObservable unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters.";
}
} else {
// Reading the value
if (!_hasBeenEvaluated)
evaluateImmediate();
ko.dependencyDetection.registerDependency(dependentObservable);
return _latestValue;
}
} has no method 'push'
Funziona perfettamente, grazie! (il violino dà un 404 però) – dgorissen
Dovrebbe anche aggiungere a questo che per ottenere un tag che funzioni correttamente con una casella di controllo, devi fare l'attr: {for: 'prefix-' + $ data.Id} tipo vincolante. deve essere presente per i pulsanti jQuery, ecc. –
Perché viene chiamato 'shouldBeDisabled' per ogni elemento nell'array degli articoli? Capisco perché viene chiamato quando cambia "self.checked", ma perché esegue iterate sull'intero array 'items'? – arb