Collegamento del servizio e delle funzioni di fabbrica al controller $ scope in AngularJS

3

Sto cercando di mantenere i miei controller il più sottili possibile, quindi mantengo la logica del dominio nei servizi e nelle fabbriche.

Quando devo chiamare una funzione in risposta a un'azione dell'utente come un clic, assegno la funzione di fabbrica o di servizio alla variabile $scope del controller.

$scope.saveStuff = myFactory.SaveStuff;

myFactory.SaveStuff chiama effettivamente un gruppo di funzioni private che $scope non può vedere. Sono rimasto un po 'sorpreso dal fatto che una chiamata a $scope.saveStuff non abbia comportato errori di riferimento.

Come funziona? $scope.saveStuff è solo un puntatore a myFactory.SaveStuff ? Significa che $scope.saveStuff è in realtà in esecuzione all'interno dell'ambito di myFactory , quindi ha accesso a qualsiasi dato / funzione privato all'interno di myFactory ?

    
posta Legion 27.05.2016 - 17:15
fonte

2 risposte

0

Hai familiarità con le chiusure di JavaScript? La funzione si chiude sulle altre funzioni in modo da conservarne la memoria quando le chiami nel controller o nella funzione di collegamento.

Considera questo:

function publicOne() {
  var x = { val: 5 }
  publicTwo(x);
  console.log(x);
}

function publicTwo(obj) {
  _privateOne(obj);

  function _privateOne(v) {
    obj.val++
  }
}

Qui, publicOne chiama publicTwo , ma _privateOne è privato a publicTwo . Tuttavia, viene chiamato nel contesto di publicOne perché si chiude sulla funzione _privateOne .

    
risposta data 20.07.2016 - 21:35
fonte
0

In Javascript, le funzioni sono oggetti . Function oggetti.

Come oggetti possono essere referenziati da variabili. Questo è praticamente ciò che facciamo con $scope.myFunction = function().. .

Quindi, in pratica quello che stai facendo è fare riferimento alla funzione factory dalla scope var . Qui $ scope sta tunnizzando la funzione, invece di astrarla. Quindi accoppi l''interfaccia' di $ scope all'interfaccia di fabbrica.

Does this mean that $scope.saveStuff is actually executing inside the scope of myFactory so it has access to any private data/functions inside myFactory?

No, significa solo che la tua vista sta facendo scattare la fabbrica. rematori $ scope ignari dei dettagli di implementazione della fabbrica. Tutto ciò che è incapsulato all'interno della Factory è definito come locale e rimane locale alla fabbrica, a prescindere che le sue funzioni pubbliche siano referenziate da terzi membri o meno.

Lo stesso vale per la funzione saveStuff . Ha il suo ambito locale che non è visibile da $scope .

Se non esponi i metodi privati, l'ambito $ e quindi la vista e il modello non avranno accesso ad essi.

    
risposta data 16.07.2017 - 11:45
fonte

Leggi altre domande sui tag