0

Je travaille sur la forme dynamique avec ng-repeat. J'utilise oi-select pour charger mon lieu. Je charge ce formulaire dans un popup modal. En ce qui concerne obtenir mes valeurs de localisation, j'appelle une fonction api sur le clic de mon bouton d'ouverture modale. En cas de succès de cet appel api j'appelais ng-init méthode. Selon mon exigence, je devrais faire appel api sur le clic du bouton d'ouverture modale. Si je clique sur ce bouton la première fois, par défaut ma première valeur d'emplacement n'est pas chargée dans la boîte de sélection. Parce que ma fonction ng-init appelée avant mon appel api. Autre que la première fois son fonctionnement bien. Ce n'est que la première fois que la valeur [0] de l'emplacement n'a pas été chargée par défaut. Ma question est de savoir comment retarder cette fonction ng-init ?. Existe-t-il un autre moyen de résoudre ce problème? Ici, j'ai attaché mon lien plunker. S'il vous plaît aidez-moi de cette question. https://plnkr.co/edit/xDVetaZIzpFdKLS9ihU6?p=previewComment retarder ma fonction ng-init jusqu'à ce que mon appel api soit un succès

code html

<body class="container row"> 
<div ng-app="myApp"> 
    <div ng-controller="myCtrl"> 
     <a class="btn btn-primary" data-toggle="modal" href='#modal-id' ng-click="getLocation()">Trigger modal</a> 
     <div class="modal fade" id="modal-id"> 
      <div class="modal-dialog"> 
       <div class="modal-content"> 
        <div class="modal-header"> 
         <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button> 
         <h4 class="modal-title">Modal title</h4> 
        </div> 
        <div class="modal-body"> 
         <form role="form" name='userForm' novalidate> 
          <div class="container"> 
           <div class="row" ng-repeat="user in users"> 
            <div class="form-group"> 
             <div class="col-md-3"> 
              <label>ID</label> 
              <input ng-model="user.id" id="user.id" name="user.id" placeholder="Enter bugid" type="text" required readonly disabled> 
             </div> 
             <div class="col-md-3"> 
              <label>Comments</label> 
              <textarea ng-model="user.comment" id="textarea1" rows="1" required></textarea> 
             </div> 

             <div class="col-md-3 "> 
              <label>Location</label> 

              <oi-select ng-model="user.location" multiple oi-options="v for v in locations" ng-init='initLocation(user, locations)' name="select2" required> 

              </oi-select> 
             </div> 
            </div> 

           </div> 
          </div> 
          <div class="buttonContainer text-center btn-container"> 
           <br> 
           <button ng-disabled="userForm.$invalid" type="button" id="adduser" ng-click="adduser()">Add user</button> 
           <button type="button" class="btn button--default btn--small pull-center">Close</button> 
          </div> 
         </form> 
        </div> 

       </div> 
      </div> 
     </div> 
     <script src="https://code.jquery.com/jquery.min.js"></script> 
     <link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet" type="text/css" /> 
     <script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script> 
    </div> 
</div> 

js Code

var app = angular.module('myApp', ['ngResource', 'oi.select']); 

app.factory('commonService', function($http, $q) { 
return { 
    preFCSManualReleases: function() { 
     var deferred = $q.defer(); 
     var url = "data.json"; 
     $http.get(url, { 
      headers: { 
       'Content-Type': 'application/json', 
       'Accept': 'application/json' 
      }, 
      data: '' 
     }).then(function(data) { 
      deferred.resolve(data.data); 
     }); 

     return deferred.promise; 
    } 
} 
}); 
app.controller('myCtrl', function($scope, commonService) { 
$scope.getLocation = function() { 
    $scope.ids = [1, 2]; 
    commonService.preFCSManualReleases().then(function(data) { 

     $scope.locations = data; 
     console.log('$scope.location[0]==============>', $scope.locations[0]) 
     $scope.initLocation = (user, locations) => { 
      if (!user.location.length) { 
       user.location.push(locations[0]); 
      } 
     } 
    }); 

    $scope.users = $scope.ids.map(function(id) { 
     return { 
      id: id, 
      comment: "", 
      location: [] 
     }; 
    }); 
} 
$scope.adduser = function() { 
    var data = $scope.users.map(function(user) { 

     return { 
      "userid": user.id, 
      "manualcomment": user.comment, 
      "location": user.location 
     } 
    }); 

    console.log("data", data) 

} 

    }); 

Répondre

0

Vous pouvez mettre une condition sur la oi-select parent:

<div class="col-md-3" ng-if="locationsLoaded"> 
    <label>Location</label> 

    <oi-select ng-model="user.location" multiple oi-options="v for v in locations" ng-init='initLocation(user, locations)' name="select2" required> 

    </oi-select> 
</div> 

Vous c un contrôleraient dans le scope.locationsLoaded $ dans votre contrôleur:

$scope.getLocation = function() { 
    $scope.locationsLoaded = false; 
    commonService.preFCSManualReleases().then(function(data) { 

     $scope.locations = data; 
     console.log('$scope.location[0]==============>', $scope.locations[0]) 
     $scope.initLocation = (user, locations) => { 
      if (!user.location.length) { 
       user.location.push(locations[0]); 
      } 
     } 

     $scope.locationsLoaded = true; // we now have the required data 
    }); 
} 

Le ng-compilera si l'élément une fois locationsLoaded est vrai et quand est déclenché le ng-init, vous êtes sûr qu'il ya des données.