Ecco una risposta più diretta alla tua domanda.
Nel secondo esempio, si fa riferimento a una funzione che deve trovarsi nell'ambito globale (ad esempio una proprietà dell'oggetto window
).
Nel primo esempio, ci si riferisce a una proprietà del modello di vista corrente.
Sì, è una sottile distinzione, ma è importante. Se si utilizzano gli attributi on-evento, è possibile fare riferimento solo a cose che esistono nell'ambito globale. Ciò significa che devi mettere tutto ciò che vuoi accedere nell'ambito globale, che porta a un codice molto caotico.
Se si utilizzano collegamenti dichiarativi, il significato esatto dei binding dipende invece dal contesto.
Aiuta a pensare al codice HTML come a una coincidenza. Quello che stai guardando veramente è l'accesso strutturato al modello di vista. Pensa a with
e forEach
come contesti nidificati e agli altri collegamenti come loro attributi. La relazione tra i binding dichiarativi e l'HTML sottostante sembra improvvisamente più come lavorare con XSLT.
I due esempi look molto simili. Ma i concetti sottostanti sono molto diversi e sono ciò che rende l'associazione dei dati così potente e gli attributi on-event così odiosi.
La ragione per cui gli attributi degli eventi sono disapprovati non è solo il fatto che essi mischiano logica e struttura. È che sono un debole tentativo di imbucare codice JavaScript arbitrario in elementi HTML che impedisce il corretto incapsulamento della logica dell'applicazione.Gli attributi on-event sono "hook" di basso livello, i collegamenti estendono il comportamento degli elementi.
Tutto ciò detto, è probabile che sia possibile fare le stesse cose orribili che le persone hanno fatto con gli attributi on-event usando i binding dichiarativi. La differenza è in che altro si può fare con loro. Non dovresti sempre giudicare le tecnologie in base a come possono essere abusate - siamo tutti adulti qui.
fonte
2012-06-18 00:40:23
Sono sempre stato convinto che dovresti provare a non avere più di una lingua in un singolo file. tipicamente ho impostato un id o una classe e lego la funzione ad esso dopo che la pagina ha finito di costruire. – dqhendricks
Sembra che il problema qui sia meno su MVVM e altro sui pro/contro di JavaScript non intrusivo: http://en.wikipedia.org/wiki/Unobtrusive_JavaScript – Craig
@Craig Avere quel collegamento dati nel markup non sembra nel spirito di non invadente js, quindi non sono sicuro che sia davvero di cosa si tratta. – heisenberg