2016-05-31 14 views
0

Ich habe einen eckigen Service, um meine Versprechen zu halten, aber ich bin mir nicht sicher, wie die Werte auf $ Scope von innerhalb des Dienstes zu manipulieren. Ich verstehe, was ich mache, ist falsch, verstehe aber nicht, was ich tun muss, um richtig zu sein.angular service nicht Werte wie erwartet manipulieren

In meinem Dienst:

.service('resolvePromiseService', function(){ 
    var publicInterface = { 
     resolvePromise: resolvePromise 
    } 

function resolvePromise(promise, resultObject, callBackFunction, spinner){ 
    spinner ++; 
    promise.then(function(result){ 
     resultObject = result; 
     if(callBackFunction){ 
      callBackFunction(); 
     } 
    }); 
    promise['catch'(function(error){ 
     //generic error handling 
    }); 
    promise['finally'(function(){ 
     spinner--; 
    }); 
} 

und in meinem Controller, die den Dienst

var getInfoPromise = dataAccessService.getInfoByLocationId(locationId).$promise; 
resolvePromiseService.resolvePromise(getInfoPromise, $scope.locationInfo, $scope.setUpLocation, $scope.loadingSpinner); 

Innerhalb der resolvePromise Funktion aufruft, ich sehe die Werte wie erwartet kommen und aktualisiert werden wie erwartet, aber ich denke, ich missverstände die Art, wie $ scope herumgereicht wird. Ich glaube, ich ersetze die eckigen Objekte durch Vanille Javascript Objekte.

+0

JavaScript hat eine 'return' Aussage. Weitere Informationen finden Sie unter [MDN-JavaScript-Referenz - Rückgabeanweisung] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/return). Verwenden Sie es, um alle Faltungen mit Rückrufen zu vermeiden. – georgeawg

+0

@georgeawg unglaublich hilfreich, danke –

Antwort

1

Die beste Option wäre, dass Sie Ihr Scope-Objekt übergeben oder überdenken, wie Sie mit Versprechungen umgehen.

Der Grund dafür liegt in der Änderung der Referenzen.

In Ihrem Beispiel

$scope.loadingSpinner = 5; // ref1 - val 5 
function resolvePromise(promise, resultObject, callBackFunction, spinner){ 
    // when we enter the function both $scope.loadingSpinner and spinner are both 
    // referencing the same variable 
    spinner; // ref1 - val5 
    // after we increment spinner the local reference is no longer pointing 
    // at the reference 
    spinner; // ref2 - val6 
    // therefore we are not actually updating the $scope.loadingSpinner 
    //reference just the local spinner one 
} 

Ich habe einen Schnipsel enthalten, diesen Punkt zu demonstrieren - Sie müssen im Auge behalten, dass Sie die Referenz neu zuweisen, das nicht das, was Sie in diesem Fall zu tun beabsichtigen.

angular 
 
    .module('Test',[]) 
 
    .service('IncrementService', incrementService) 
 
    .controller('MyController', myController) 
 

 
function incrementService() { 
 
    this.increment = function(valToInc) { 
 
    valToInc++; 
 
    console.log(valToInc); 
 
    } 
 
    
 
    this.incrementScopeField = function($scope, field) { 
 
    $scope[field]++; 
 
    console.log($scope[field]); 
 
    } 
 
} 
 

 
myController.$inject = ['$scope', 'IncrementService']; 
 

 
function myController($scope, IncrementService) { 
 
    $scope.number = 5; 
 
    $scope.inc = function() { 
 
    IncrementService.increment($scope.number); 
 
    } 
 
    $scope.inc2 = function() { 
 
    IncrementService.incrementScopeField($scope, 'number'); 
 
    } 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 

 
<div ng-app='Test' ng-controller='MyController'> 
 
    <button ng-click='inc()'>increment value</button><button ng-click='inc2()'>increment scope</button> 
 
    <br/>{{ number }} 
 
</div>

+0

ist es schlechte Praxis, $ Scope in einen Service zu übergeben –

+0

Es ist nicht ideal - es wäre besser, das Ergebnis des Versprechens in Ihrem Controller zu behandeln. In diesem Fall lösen Sie das Versprechen mit Ihrem inkrementierten Wert und weisen dann '$ scope.loadingSpinner' im Closure –

+0

zu. Das Problem dabei ist, dass ich mehrere '$ scope'-Variablen habe, die innerhalb der Versprechungsauflösung geändert werden müssen. Ich vermisse ein Stück größere Architektur Ich glaube, –

Verwandte Themen