在控制器中获取未定义

时间:2015-12-24 13:11:28

标签: angularjs angularjs-scope

我正在尝试从服务中获取值,然后在控制台日志中打印该值,这使得我在控制器中未定义。

正在正确返回服务的价值。但是我无法在getRRSDetails函数之外访问vm.rrsData。 vm.rrsData在函数外部未定义。

请建议。

我的控制员:

    (function () {

  'use strict';

  var angular = window.angular;

  function RRSCtrl(
    $translate,
    RRSSvc
  ) {

    var vm = this;

    // Private

    function getRRSDetails() {
      RRSSvc.getRRSDetails()
        .then(function (data) {
          vm.rrsData = data;
        });
    }


    getRRSDetails();

    console.log('vm.rrsData'+ JSON.stringify(vm.rrsData)); // returning undefined here 
  }

  angular
    .module('quote')
    .controller('RRSCtrl', [
      '$translate',
      'RRSSvc',
      RRSCtrl
    ]);

}());

我的服务:

(function () {

  'use strict';

  var angular = window.angular;

  function RRSSvc(
    $http,
    $q,
    UserSvc,
    UtilitiesSvc
  ) {

    function rrsError(messageKey) {
      UtilitiesSvc.showMessage(messageKey, 'error', 'generate-blank-demo-error');
    }

    function getRRSDetails(poID) {
      return $http.get('quote/accounts/' + UserSvc.get('accountId') + '/pos/' + poID + '/rrs?serialNumber=')
        .then(function (response) {
          return response.data;
        })
        .catch(function (e) {
          rrsError('quote.messages.GET_RRS_ERROR');
          $q.reject(e);
        });
    }



    return {
      getRRSDetails: getRRSDetails
    };
  }

  angular.module('quote')
    .service('RRSSvc', [
      '$http',
      '$q',
      'UserSvc',
      'UtilitiesSvc',
      RRSSvc
    ]);

}());

2 个答案:

答案 0 :(得分:3)

由于您正在发出异步请求,因此完全正常 考虑这两行:

getRRSDetails();

console.log('vm.rrsData'+ JSON.stringify(vm.rrsData)); // returning undefined here 

console.log将在上述函数解析之前运行。所以,当时vm.rrsData未定义。

要查看值,您必须在函数中包含console.log

function getRRSDetails() {
  RRSSvc.getRRSDetails()
    .then(function (data) {
      vm.rrsData = data;
      console.log('vm.rrsData'+ JSON.stringify(vm.rrsData)); // has value from the http call 
    });
}

<强>更新
写上述内容的另一种方式可能更清楚:

RRSSvc.getRRSDetails().then(onRSSDetails);

function onRSSDetails(response) { 
   // here you do whatever you want with data.
   console.log(response);
}

答案 1 :(得分:0)

尝试在控制器中调用您的服务,如下所示:

this.rrsData = null; //declare variavle to store service data

RRSSvc.getRRSDetails()
        .then(function (data) {
          this.rrsData = data;
        }.bind(this)); // bind is the key to store the context

console.log('rrsData'+ JSON.stringify(this.rrsData));