2016-11-20 2 views
2

Я пытаюсь использовать компонент 1.5 с AngularJS. У меня есть служба, которая получает мой JSON-файл с использованием $ HTTP и возвращает обещание. Затем я разрешаю обещание в контроллере компонентов и назначаю его значению на контроллере, используя this.work. Хотя это не показано на моей странице HTML. Я включил комментарии в код, чтобы объяснить немного лучше, если это сбивает с толку.HTTP Get Angular 1.5 component

Это мое понимание, что решение обещания (в моем контроллере) происходит асинхронно, но после того, как оно будет разрешено, почему я не показывал обновленную измененную на переменную $ctrl.work в представлении. Вместо этого я никогда не получаю значение от переменной.

// 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}} 

ответ

0

Вы освобождаете контекст исполнения, что означает, что this внутри вашей функции обратного вызова, если нет, и экземпляр компонента контроллера. Простым (и современным) решением является использование arrow function вместо обычного анонимного:

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

Спасибо. Если вы знаете или можете указать мне в правильном направлении, использование 'this' для назначения вещей в контроллере кажется проблематичным в том смысле, что я никогда не мог бы присвоить что-то контроллеру, используя' this' внутри функции, поскольку, как вы заявили в ваш ответ, контекст этого не будет связан с компонентом контроллера. Каким образом все должно быть сделано (а не использовать функции стрелок)? – okayilltry

+0

Вы можете сохранить ссылку на правильную 'this' в начале и использовать ее позже:' const self = this; ... self.work = d.test'. Но это старая школа. Функция Arrow - это самое чистое решение. – dfsq

Смежные вопросы