Declinazione di responsabilità: Questo è il mio primo tentativo di creare un'app MVVM Anche in precedenza non ho lavorato con vue.js, quindi potrebbe essere che il mio problema sia il risultato di un problema più fondamentale .Vue JS Guardare oggetti nidificati profondi
Ritengo ho due tipi di blocchi con caselle:
- Tipo 1: blocco/caselle
- tipo 2: blocco/intestazioni/checkboxes
Il sottostante oggetto è strutturato in questo modo:
{
"someTopLevelSetting": "someValue",
"blocks": [
{
"name": "someBlockName",
"categryLevel": "false",
"variables": [
{
"name": "someVarName",
"value": "someVarValue",
"selected": false,
"disabled": false
}
]
},
{
"name": "someOtherBlockName",
"categryLevel": "true",
"variables": [
{
"name": "someVarName",
"value": "someVarValue",
"categories": [
{
"name": "SomeCatName",
"value": "someCatValue",
"selected": false,
"disabled": false
}
]
}
]
}
]
}
miei obiettivi
caselle Selezione:
- utente fa clic su casella di controllo, casella di controllo è selezionata (selezionato = true)
- Metodo è sparato per controllare se tutte le altre caselle di controllo devono essere disabilitato (disabilitato = true). (Se questo metodo ha infatti disattivato qualsiasi cosa, si chiede anche di nuovo, perché altri elementi potrebbero essere a sua volta dipende dal elemento disattivato)
- Un altro metodo aggiorna alcune altre cose, come le icone ecc
caselle di controllo Cancellazione
Un utente può fare clic su un pulsante "Cancella", che deseleziona tutte le caselle di controllo in un elenco (selezionato = falso). Questa azione dovrebbe anche innescare i metodi che disattiva opzionalmente caselle di controllo e aggiorna le icone ecc
Il mio metodo attuale(che non sembra giusto)
- L'attributo selezionato del dati- il modello è associato allo stato selezionato dell'elemento checkbox tramite la direttiva
v-model
. - L'attributo disabilitato (dal modello) è associato alla classe dell'elemento e all'attributo disabilitato. Questo stato è impostato dal metodo sopra menzionato.
- Per inizializzare i metodi che disattivano le caselle di controllo e modificano alcune icone, sto usando una direttiva
v-on="change: checkboxChange(this)"
. Penso che ho bisogno di fare questa parte in modo diverso metodo - Il clearList si chiama via
v-on="click: clearList(this)"
I problemi con la mia messa a punto corrente è che l'evento cambiamento non sta sparando quando le caselle di controllo vengono cancellati programatically (vale a dire non per interazione dell'utente).
Quello che vorrei invece
Per me la cosa più logica da fare sarebbe quella di utilizzare this.$watch
e tenere traccia delle modifiche nel modello, invece di ascoltare per gli eventi DOM.
Una volta apportato un cambiamento, dovrei quindi identificare quale oggetto esatto è cambiato e agire di conseguenza. Ho provato a creare una funzione $watch
che osserva l'array blocks
. Questo sembra raccogliere bene le modifiche, ma restituisce l'intero oggetto, a differenza dell'attributo individuale che è cambiato. Inoltre a questo oggetto mancano alcuni utili attributi di supporto, come $parent
.
Posso pensare ad alcuni metodi hacky per far funzionare l'app (come ad esempio l'attivazione manuale degli eventi di modifica nel metodo clearList, ecc.) Ma il mio caso d'uso sembra piuttosto standard, quindi mi aspetto che ci sia probabilmente un modo molto più elegante di gestire questo.
. Selected e .disabled sono proprietà di oggetti variabili anonimi che appartengono all'array delle variabili. Il tuo esempio funziona perché è solo un singolo oggetto non un array. – Hendrik
Ho fatto qualcosa come block.checkbox.active, ma non funziona finché non li aggiungo in "" come accennato sopra. Grazie. Ora funziona. –