2015-01-21 2 views
0

Мне нужно вызвать служебную переменную в контроллере. Я попытался вызвать $scope.userData1.data.name вне функции Сервис, он не определен. Если я положил {{userData1}} в шаблон Сообщения Ctrl, он отображает весь массив данных, включая имена.angularJS с использованием служебной переменной

Мне нужно загрузить i-frame, используя переменную user_name.

angular.module('starter.controllers', []) 


.factory('UserService', function($http) { 
var data; 

     return{ 
      getData: function($http) { 
        return $http.get("http://www.website.com/index.php/id/user/call12"). 
        success(function(response) { 
        /// console.log(JSON.stringify(response)); 
         userData=response.data; 
          return userData; 

        }).error(function(data, status, headers, config) { 
        // log error 
        }); 
      } 
    } 
}) 
.controller('MessagesCtrl',function ($scope, Messages,$http,$ionicPopup,$timeout,$window,UserService,Outbox,$sce) { 

    $scope.userData1 = {}; // updated 
$scope.myCtrl2= function(UserService,$http) { 
UserService.getData($http).then(function(data) { 
    $scope.userData1 = data; 
console.log($scope.userData1.data.name); // USERNAME exist 
    var name= $scope.userData1.data.name; 
}); 
} 

$scope.myCtrl2(UserService,$http); 

var name= $scope.userData1.data.name; //undefined 
$scope.formData4.upload_url = $sce.trustAsResourceUrl("http://www.website.com/index.php/id/user/view_form/"+ name); 

}) 

шаблона:

<form ng-controller="MessagesCtrl" ng-disabled="isRequesting"> 
<span class="item item-input" > 
    <span class="input-label">&nbsp;</span> 
<iframe id="iframe-123" src="{{formData4.upload_url}}" style="border: 0px none; height: 80px; margin: auto; width: 100%; overflow: hidden;" frameborder=0></iframe></span>  
</form> 
+0

возможно дубликат [Как вернуть ответ от Ajax позвонить?] (Http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-a-ajax-call) –

+0

@AlexisKing Привет Алексис. Ответ был возвращен в хорошей форме. но область действия не может использоваться вне функции, называемой службой. – xyonme

+0

Проблема заключается в том, что при использовании конструкции 'MessagesCtrl',' $ scope.userData1.data.name' был оценен до того, как 'callback'' $ http' был уволен -> получил 'undefined', потому что вы не инициализировали '$ scope.userData1'. И еще кое-что о вашем коде, вам не нужно вводить 'UserService' и' $ http' в '' scope.myCtrl2' из-за 'javascript закрытия'. Взгляните на эту скрипку, я уже изменил ваш тайм-аут $ http до $, но он должен работать одинаково. Надеюсь, поможет. http://jsfiddle.net/themyth92/w0st1y7e/ – themyth92

ответ

1

Вы получили undefined, потому что в этот момент, ответ (http.get) не возвращаются с сервера.
Вы должны убедиться, что эта функция $scope.myCtrl2(UserService,$http) получила ответ асинхронный, прежде чем вы сможете позвонить на следующую строку (var name = $ scope.userData1.data.name;).

Лучшим решением является использование promise - $q службы, как это:

.controller('MessagesCtrl',function ($scope, Messages,$http,$ionicPopup,$timeout,$window,UserService,Outbox,$sce,$q) { 

    $scope.userData1 = {}; // updated 
    $scope.myCtrl2= function(UserService, $http) 
    { 
     var deferred = $q.defer(); 
    UserService.getData($http).then(function(data) 
     { 
     $scope.userData1 = data; 
     console.log($scope.userData1.data.name); // USERNAME exist 
     var name= $scope.userData1.data.name; 

      deferred.resolve(); 
     }); 
      return deferred.promise; 
    } 

    $scope.myCtrl2(UserService,$http).then(function(){ 
     var name= $scope.userData1.data.name; //Now you got the answer!!! 
     $scope.formData4.upload_url = $sce.trustAsResourceUrl("http://www.website.com/index.php/id/user/view_form/"+ name); 
    }); 
}) 
+0

большое спасибо. Недавно я изучил AJS. Наконец-то я получил ответ. – xyonme

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