Definizione del controller AngularJS

0

Sto iniziando ad usare il framework AngularJS (v1), e dopo aver consultato le buone pratiche ho trovato quegli esempi (da questa pagina link ), come:

/* recommended */
function SessionsController() {
    var vm = this;

    vm.gotoSession = gotoSession;
    vm.refresh = refresh;
    vm.search = search;
    vm.sessions = [];
    vm.title = 'Sessions';

    ////////////

    function gotoSession() {
      /* */
    }

    function refresh() {
      /* */
    }

    function search() {
      /* */
    }
}

Sono l'unico a trovarlo strano? Sembra una cattiva pratica in JavaScript.

  • Ogni volta che crei un controller, dovrai scrivere funzioni e anche scrivere tutti gli accessor su tutte loro. Sembra inutile e anche meno leggibile poiché mescola l'attribuzione e gli attributi dei metodi.

  • Ogni volta che questo controller viene istanziato, tutti i metodi verranno riscritti. Non dovremmo usare un prototipo per condividere metodi tra tutte le istanze?

function SessionsController() {
    this.sessions = [] ;
    this.title = 'Sessions' ;
}

SessionsController.prototype = {
    gotoSession : function() {
        /* */
    },

    refresh : function() {
        /* */
    },

    search : function() {
        /* */
    }
} ;

Non è più semplice, più leggibile e più efficiente?

Forse mi sono perso qualcosa. Cosa ne pensi?

    
posta Tot 18.10.2016 - 12:25
fonte

2 risposte

1

Penso che sia ben spiegato anche nella styleguide. Poiché JavaScript non carica i file come C # o Java include, dovrebbe essere ovvio identificare i membri pubblici di un servizio / componente.

ref: link :

"Colloca i membri associabili nella parte superiore del controller, in ordine alfabetico e non distribuiti attraverso il codice del controller.

Perché ?: Il posizionamento dei membri collegabili nella parte superiore facilita la lettura e consente di identificare immediatamente quali membri del controller possono essere associati e utilizzati nella vista. "

    
risposta data 18.10.2016 - 12:43
fonte
0

Come @jlast menzionato è bello avere membri pubblici elencati nella parte superiore del costruttore.
MA
Quando si tratta di perché tali funzioni non sono dichiarate dal prototipo , penso che la ragione sia il meccanismo di dipendenza dall'iniezione .

Se dichiari metodi all'interno del costruttore, puoi ottenere un rapido accesso ai servizi angolari iniettati.

function SessionsController(sessionService) {
    var vm = this;

    vm.gotoSession = gotoSession;
    vm.refresh = refresh;

    function gotoSession() {
      if (sessionService.isSessionValid()) {
         // Do something
      }
    }
}

Non è necessario associare tutti i servizi all'istanza del controllore se si desidera accedervi tramite i metodi dei controller.
E quando si tratta di

Each time you create a controller, you'll have to write functions and also write all accessors to all of them.

Sì, devi farlo e per di più dovresti farlo. Ogni componente (o direttiva) dovrebbe avere il proprio controller.
Il motivo principale è il codice più prevedibile e meglio separato guarda qui:
link

    
risposta data 31.01.2017 - 10:48
fonte

Leggi altre domande sui tag