2016-11-20 6 views
2

Ich versuche, eine 1.5-Komponente mit AngularJS zu verwenden. Ich habe einen Dienst, der meine JSON-Datei mit $ HTTP abruft und die Zusage zurückgibt. Ich löste dann das Versprechen in meinem Komponenten-Controller und weise ihm einen Wert auf dem Controller zu, der this.work verwendet. Obwohl dies auf meiner HTML-Seite nicht angezeigt wird. Ich habe Kommentare in den Code eingefügt, um ein wenig besser zu erklären, wenn das verwirrend ist.HTTP Get Angular 1.5-Komponente

Es ist mein Verständnis, dass die Auflösung des Versprechens (in meinem Controller) asynchron passiert, aber sobald es gelöst ist, warum ich nicht die aktualisierte auf die Variable $ctrl.work in der Ansicht geändert angezeigt. Stattdessen erhalte ich nie einen Wert von der Variablen.

// Component 
    (function() { 
     angular.module('development') 
      .component('pgDev', { 
       templateUrl: 'app/development/development.template.html', 
       controller: ['workList', function (workList) { 

        //this.work = 'HELLO WORLD'; // <- this shows up in the html if uncommented 

        workList.getWorkItems().then(function (d) { 
         console.log(d.test); // outputs: myjsonfile 
         this.work = d.test; // <- this doesnt show in the html 
        }); 

       }] 
      }) 
    }()); 

    // HTTP Get Service 
    (function() { 
     angular.module("development").factory("workList", ["$http", 
      function ($http) { 
       return { 
        getWorkItems: function() { 
         return $http.get("data/worklist/worklist.json").then(function (d) { 
          return d.data; 
         }); 
        } 
       } 
      }]) 
    })(); 

    // html 
    workitems: {{$ctrl.work}} 

Antwort

0

Sie verlieren Zusammenhang mit der Ausführung, die die this innerhalb Ihrer Callback-Funktion bedeutet, wenn nicht und Instanz des Component-Controllers. Eine einfache (und moderne) Lösung ist die Verwendung von arrow function anstelle von normalen anonymen:

workList.getWorkItems().then(d => { 
    this.work = d.test; 
}); 
+0

Danke. Wenn Sie wissen, oder könnte mich in die richtige Richtung zeigen, mit 'this ', um Dinge innerhalb des Controllers zuzuweisen scheint problematisch in dem Sinne, dass ich nie etwas dem Controller zuweisen könnte mit' this' innerhalb einer Funktion, da, wie Sie in Ihre Antwort, der Kontext wäre nicht mit der Controller-Komponente verbunden. Auf welche Weise sollten die Dinge gemacht werden (anstatt Pfeilfunktionen zu verwenden)? – okayilltry

+0

Sie können den Verweis auf "this" am Anfang speichern und später verwenden: 'const self = this; ... self.work = d.test'. Aber das ist alte Schule. Die Pfeilfunktion ist die reinste Lösung. – dfsq