2016-05-10 7 views
0

Ich schreibe eine Wrapper-Bibliothek, die eine Speicherfunktion hat. Im Grunde ruft es nur die $http.post Funktion auf und gibt das Versprechen zurück (der Kürze halber).

Leider ist der this Operator in der Funktion, die aufgerufen wird, wenn das Versprechen gelöst ist (das heißt die Funktion, die mit den Ergebnisdaten aufgerufen wird) auf das Window Objekt. Ich frage mich also, ob es eine Möglichkeit gibt, den Operator this an ein anderes Objekt zu binden, wenn das Versprechen aufgelöst oder zurückgewiesen wird?

Bitte schauen Sie auf den Code unten, um mehr Sinn zu machen:

angular.module('SomeService', []).service('$service', function($http) { 
 
    this.get = function() { 
 
    return $http.get('http://jsonplaceholder.typicode.com'); 
 
    } 
 

 
    return this; 
 
}); 
 

 
angular.module('testApp', ['SomeService']).controller('testController', function($service) { 
 
    $service.get().then(function(data) { 
 
    alert(this); 
 
    //It should say Object Window! 
 
    //Is is possible to bind `this` to say SomeService (example), 
 
    //Or some other object? 
 

 
    }); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app="testApp" ng-controller="testController"> 
 
    {{1+1}} 
 
</div>

Wenn Sie den Code oben ausgeführt, so die Warnung [Object Window]. Also meine Frage ist: Ist es möglich, this zu binden, um SomeService (Beispiel) oder ein anderes Objekt zu sagen?

P.S. Eine Idee ist vielleicht, dass ich einen Wrapper für $http.get schreiben kann, anstatt das Versprechen direkt zurückzugeben und dann den Operator this irgendwie zu binden, bevor ich mein eigenes Versprechen auflöste? Aber ich kann keine Informationen darüber finden, wie man Versprechen mit (this) Bindungen löst.

Update: Danke für die Vorschläge .. Ich weiß über Bind, aber der Fall ist ein wenig komplizierter. Die SomeService.save-Methode erstellt ein Objekt Objekt. Daher benötigt die Funktion, die SomeService.save() aufruft, sowohl das erstellte Element als auch die Daten, die von der $ http-Anforderung zurückgegeben werden, wenn das Versprechen aufgelöst wird. Ich fand heraus, dass ich dies nur auf das neue Item-Objekt setzte und die Daten von $ http unverändert übergab. Macht das irgendeinen Sinn? Wenn nicht, bitte sag es mir und ich werde einen Plunkr erstellen, der versucht, das Gleiche zu erklären.

+0

Verwenden '.then (function() {} .bind (Someservice))' – jcubic

+0

diese Ihnen vielleicht helfen: [Was tut var, die diese Mittel in Javascript =] (http://stackoverflow.com/ questions/4886632/what-does-var-das-das-gemein-in-javascript) – praetoriaen

Antwort

1

Das ist, was the bind method ist für.

then(function(data) { ... }.bind(window)) 
+0

Oder mit fetten Pfeilfunktionen: 'data => {}', die den Kontext von seinem übergeordneten Bereich übernehmen. – andlrc

+0

Ich bin mir ziemlich sicher, dass der Elternkontext nicht "Fenster" ist. – Quentin

+0

Hallo, danke für die Antwort .. Ich weiß über 'bind', aber der Fall ist ein wenig komplizierter .. die' SomeService.save' Methode erstellt ein 'Item' Objekt. Daher benötigt die Funktion, die 'SomeService.save()' aufruft, sowohl das erzeugte Element als auch die Daten, die von der $ http-Anforderung zurückgegeben werden, wenn das Versprechen aufgelöst wird. Ich habe herausgefunden, dass ich 'this' auf das neue' Item'-Objekt setze und die'Daten' von $ http unverändert übergebe. Macht das irgendeinen Sinn? Wenn nicht, bitte sag es mir und ich werde einen Plunkr erstellen, der versucht, das gleiche zu erklären. Danke. – supersan