2016-01-25 2 views
2

У меня есть угловая служба, которая получает объект currentuser, который разрешен как обещание. У меня есть частичный, который заполняется объектом userdetails, который вызывается внутри вызова метода, но, к сожалению, вызов метода не срабатывает при вызове после того, как обещание будет разрешено.угловой метод не стрелять в контроллер после вызова службы

.controller('AccountCtrl', [ 
    '$scope', 'userService', '$compile', '$http', 'utility', 'cloudService', function ($scope, userService, $compile, $http, utility, cloudService) { 

     $scope.userdetails = {}; 
     $scope.downloadPageChk = $scope.paymentHistoryPageChk = $scope.manageGroupsPageChk = "hide"; 
     $scope.getUserAttribute = function (param, x) { 
      return userService.getAttribute(param, x); 
     }; 
       cloudService.fetchCurrentUser().then(function (newCurrentuser) 
       { 
        if (newCurrentuser) 
        { 
         $scope.currentUser = newCurrentuser; 
         $scope.getUserDetails = function() 
         { 
          if (userService && userService.isLoggedIn()) 
          { 
           $scope.userdetails = JSON.parse(JSON.stringify(currentUser)); 
          } 
         }; 

         if (newCurrentuser == 'member') { 
          if (newCurrentuser.features.download) $scope.downloadPageChk = "show"; 
          if (newCurrentuser.features.paymenthistory) $scope.paymentHistoryPageChk = "show"; 
          if (newCurrentuser.group.enabled) $scope.manageGroupsPageChk = "show"; 
         } 
        } 
       } 
]) 

partial 
<div data-ng-controller="AccountCtrl"> 
<div data-ng-init="getUserDetails()"> 
<input type="text" class="form-control pull-left" id="FirstName" name="FirstName" data-placeholder-attr="First Name" data-ng-model="userdetails.firstname" required> 
<input type="text" class="form-control pull-left" id="LastName" name="LastName" data-placeholder-attr="Last Name" data-ng-model="userdetails.lastname" required> 
</div> 
</div> 

, пожалуйста, сообщите мне, что мне не хватает. Я ударяю головой в течение 10 часов, если я переведу пользовательские данные, если этот cloudervice.fetchuser(). Then() он по крайней мере вызывает функцию, не уверен, что происходит, когда я ее вставляю.

Похожие шлепнуть создал здесь http://plnkr.co/edit/pLAB4VpLU7uhlSibHzXP?p=preview Благодарности

ответ

0

отсутствует Вы должны переместить функцию вне метода cloudservice.fetchuser().then(). Метод getUserDetails недоступен для объекта $scope, пока вы не позвоните cloudservice.fetchuser().then(). Но вы не делаете этого в частичном.

.controller('AccountCtrl', [ 
    '$scope', 'userService', '$compile', '$http', 'utility', 'cloudService', 
    function ($scope, userService, $compile, $http, utility, cloudService) { 
    $scope.userdetails = {}; 

    $scope.getUserDetails = function(service, user) { 
     if (service && service.isLoggedIn()) { 
     $scope.userdetails = JSON.parse(JSON.stringify(user)); 
     } 
    }; 

    $scope.downloadPageChk = $scope.paymentHistoryPageChk = $scope.manageGroupsPageChk = "hide"; 

    $scope.getUserAttribute = function (param, x) { 
     return userService.getAttribute(param, x); 
    }; 

    cloudService.fetchCurrentUser().then(function (newCurrentuser) { 
     if (newCurrentuser) { 
     $scope.currentUser = newCurrentuser; 
     $scope.getUserDetails(userService, newCurrentuser); 

      if (newCurrentuser == 'member') { 
      if (newCurrentuser.features.download) $scope.downloadPageChk = "show"; 
      if (newCurrentuser.features.paymenthistory) $scope.paymentHistoryPageChk = "show"; 
      if (newCurrentuser.group.enabled) $scope.manageGroupsPageChk = "show"; 
      } 
     } 
    }); 
    }); 
]); 
+0

Нет. Я не могу переместить функцию за пределы cloudervice.fetchuser(). Then(), поскольку объект $ scope.userdetails заполняется с использованием объекта newCurrentuser, возвращенного из службы, и поскольку это асинхронный вызов – skm

+0

Я обновил ответ, чтобы показать, как вы можете извлечь метод getUserDetails и вызвать его в асинхронном методе cloudService.fetchCurrentUser.then'. – gnerkus

0

Вы работаете ng-init до того $scope.getUserDetails добавлен $scope, потому что происходит только в обратный вызов, и именно поэтому у вас возникли проблемы.

Я думаю, что вы можете следовать некоторым из основных примеров слишком близко. Поскольку вы получаете данные асинхронно, вам не нужно ng-init Вы разрешаете контроллеру запрашивать у службы загрузку данных, и когда он прибыл, вы назначаете его $scope.getUserDetails, и угловая будет помещать его на экран.

Вы можете увидеть обновленный plnkr

Позвольте мне знать, если я что-то значительное

+0

может указать разницу между 'success' в демо и' then' в вопросе кода.OP обрабатывает их одинаково относительно ответа – charlietfl

2

Если вы хотите, чтобы данные были initializied - Вам не нужно $scope.getUserDetails функции и data-ng-init="getUserDetails()".

Угловая функция выполняет функцию fetchCurrentUser и заполняет $scope.userdetails при погрузке.

cloudService.fetchCurrentUser().then(function (newCurrentuser) 
{ 
    if (newCurrentuser) 
    { 
     $scope.currentUser = newCurrentuser; 
     if (userService && userService.isLoggedIn()) 
     { 
      $scope.userdetails = JSON.parse(JSON.stringify($scope.currentUser)); 
     } 

     if (newCurrentuser == 'member') { 
      if (newCurrentuser.features.download) $scope.downloadPageChk = "show"; 
      if (newCurrentuser.features.paymenthistory) $scope.paymentHistoryPageChk = "show"; 
      if (newCurrentuser.group.enabled) $scope.manageGroupsPageChk = "show"; 
     } 
     } 
    } 
} 

См. plunker.

EDIT:

Если вы хотите, чтобы функция getUserDetails по-прежнему отпираемая после инициализации вы должны поставить его вне метода обслуживания:

$scope.getUserDetails = function(){ 
    if (userService && userService.isLoggedIn()){ 
     $scope.userdetails = JSON.parse(JSON.stringify($scope.currentUser)); 
    } 
}; 

И вызвать его, как вы хотите (с помощью ng-click="getUserDetails()" из вид или $scope.getUserDetails() с контроллера).

+0

Это работает. Но моя проблема в том, что .. если мне нужно выполнить метод, например, я вызываю ng-init после того, как доступен объект newCurrentuser? – skm

+0

@skm добавил объяснение к моему ответу, это то, что вы имели в виду? – Daniel

0

Я не вижу никакого использования директивы ng-init и метода $scope.getUserDetails, угловой двусторонний привязкой данных будет выполнять обещания. Я обновил плункер для того же самого. http://plnkr.co/edit/IzjNqpdk0zvnHYyCnKJi?p=preview

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