2015-07-18 23 views
6

Vorrei poter aggiornare un ambito in Angular da una funzione esterna ad Angular.Aggiornamento di ambito esterno AngularJs senza utilizzare "angular.element.scope"

Ad esempio, se si dispone di un plugin jQuery che restituisce una callback riuscita, mi piacerebbe poter aggiornare l'ambito da tale callback di successo. Ogni soluzione che ho visto per questo comporta chiamare angular.element(selector).scope e quindi chiamare $apply sull'ambito restituito. Tuttavia, ho anche visto molti commenti che indicano che questo non funziona quando le informazioni di debug sono disattivate e quindi non è raccomandato, ma non ho visto nessuna soluzione alternativa.

Qualcuno sa di un modo per aggiornare l'ambito dall'esterno di Angular senza utilizzare ?

Ecco la soluzione accettata nel post:.

"È necessario utilizzare $scope.$apply() se si desidera apportare modifiche a un valore di portata al di fuori del controllo di AngularJs come un gestore di eventi jQuery/javascript

function change() { 
    alert("a"); 
    var scope = angular.element($("#outer")).scope(); 
    scope.$apply(function(){ 
     scope.msg = 'Superhero'; 
    }); 
} 

Ecco un avvertimento che .scope() non funziona quando i dati di debug è spento nel post:

"FYI secondo la documentazione utilizzando .scope() richiede che i dati di debug da abilitare d ma l'uso dei dati di debug in produzione non è raccomandato per motivi di velocità. Le soluzioni di seguito sembrano ruotare intorno portata() - rtpHarry 5 dicembre '14 alle 15:12 "

non vedo alcuna soluzione alternativa all'utilizzo .scope() in questo post o in altri posti simili

.

AngularJS access scope from outside js function

Grazie!

Aggiornamento una possibile soluzione per non usare angular.element(selector).scope era ho assegnato l'ambito nel controller stavo usando FirstCtrl all'oggetto finestra. ho iniettato $window nel controller FirstCtrl e ha fatto la seguente:

$window.FirstCtrlScope = $scope; 

Poi da jQuery o altro javascript che potevo fare:

var scope=window.FirstCtrlScope; 
scope.$apply(function() { 
     // update the scope 
}); 

È questa una buona soluzione o ci sono soluzioni migliori per l'aggiornamento di un ambito senza utilizzare angular.element(selector).scope?

Grazie!

risposta

1

Penso che entrambe le strade siano cattive. La progettazione che imposta i controllers come variabili globali o l'accesso all'ambito da parte dell'elemento html conduce a un'applicazione non mantenibile con molti collegamenti nascosti.

Se è necessario collaborare con i plugin jQuery (o altri codici non angolari), inserirli in direttive con API chiare (attributi, associazioni e callback).

1

È possibile assegnare l'ambito a un attributo di dati sull'elemento, quindi accedervi. Dai un'occhiata a here dove la libreria angular-ui-bootstrap ha implementato questo approccio.

Problemi correlati