0

Je travaille sur les formes dynamiques avec ng-repeat. J'utilise la bibliothèque oi-select pour charger mes emplacements. La boîte oi-select a une fonction de sélection multiple. Sur ma page de chargement par défaut, je charge la première valeur de l'option dans cette boîte oi-select. Mais j'utilise une fonction de sélection multiple si je sélectionne une autre option que la première option qu'elle remplace avec cette valeur. En raison de ce problème, je dois sélectionner à nouveau cette première option. Ma question est, comment puis-je charger ma première valeur d'option par défaut dans ce oi-select?Valeur ng-init écrasée dans les multiples options oi-select angulaires

Ensuite, si je sélectionner d'autres options, il ne remplacera pas ma première valeur dans la boîte de sélection .Ici est mon lien plunker http://plnkr.co/edit/m6Q02dlHLBCMVLRLfioh?p=preview

mon code HTML

<body class="container row"> 
    <div ng-app="myApp"> 
     <div ng-controller="myCtrl"> 
      <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)' 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> 
      <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> 
      <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0/angular.min.js"></script> 
     </div> 
    </div> 

mon code js

var app = angular.module('myApp', ['ngResource', 'oi.select']); 
app.controller('myCtrl', function($scope, $timeout) { 
    $scope.ids = [1, 2, 3]; 
    $scope.users = $scope.ids.map(function(id) { 
     return { 
      id: id, 
      comment: "", 
      location: "" 
     }; 
    }); 
    $scope.locations = ['india', 'usa', 'jermany', 'china', 'Dubai']; 
    $scope.initLocation = (user) => { 
     $timeout(() => { 
      user.location = $scope.locations[0]; 
     }); 
    } 
    $scope.adduser = function() { 
     var data = $scope.users.map(function(user) { 
      return { 
       "userid": user.id, 
       "manualcomment": user.comment, 
       "location": user.location 
      } 
     }); 

     console.log("data", data) 
    } 

}); 
+0

que vous avez pu résoudre le problème? –

+0

Si l'emplacement est des données statiques, cela fonctionne correctement. Mais selon ma nouvelle condition je charge ce formulaire dans le popup modal. mes valeurs de localisation proviennent de l'appel api. Seulement Pour la première fois si je clique sur mon bouton contextuel modal mes premières données de localisation ne sont pas chargées par défaut dans la boîte de sélection, la méthode ng-init() ne fonctionne pas. Mais si je suis à nouveau cliquez sur le bouton contextuel son fonctionnement bien. La première fois, il n'a pas été chargé cette première valeur d'emplacement. J'ai attaché mon lien de plunker ici. aidez-moi s'il vous plaît .https: //plnkr.co/edit/xDVetaZIzpFdKLS9ihU6? p = preview – user3760261

Répondre

0
  1. Si vous utilisez l'attribut multiple, moi ce ans le modèle doit être un tableau et non une chaîne comme dans votre cas user.location = $scope.locations[0];, ypu doit le changer en location: [] et utiliser push() method pour ajouter les éléments initiaux à ce tableau; L'utilisation de $timeout n'a aucun sens pour moi;

  2. ngInit ajoute une quantité inutile de logique dans le modèle, je préférerais éviter de l'utiliser dans votre cas, utilisez simplement location: [$scope.locations[0]] dans votre contrôleur.

Exemple de travail:

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

 
app.controller('myCtrl', function($scope, $timeout) { 
 
    $scope.ids = [1, 2]; 
 
    
 
    $scope.locations = ['india', 'usa', 'jermany', 'china', 'Dubai']; 
 
    
 
    $scope.users = $scope.ids.map(function(id) { 
 
    return { 
 
     id: id, 
 
     comment: "", 
 
     location: [] 
 
    }; 
 
    }); 
 

 
    $scope.initLocation = (user, locations) => { 
 
    if (!user.location.length) { 
 
     user.location.push(locations[0]); 
 
    } 
 
    } 
 
    
 
    $scope.adduser = function() { 
 
    $scope.users.push({ 
 
     id: Math.max(...($scope.users.map(u => { return u.id; }))) + 1, 
 
     comment: "added from controller", 
 
     location: [$scope.locations[2]] 
 
    }); 
 
    } 
 

 
});
<!DOCTYPE html> 
 
<html> 
 

 
    <head> 
 
    <meta charset="utf-8" /> 
 
    <link data-require="[email protected]" data-semver="3.3.5" rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" /> 
 
    <link rel="stylesheet" href="//rawgit.com/tamtakoe/oi.select/master/dist/select.css" /> 
 
    
 
    <script>document.write('<base href="' + document.location + '" />');</script> 
 
    <script data-require="[email protected]" src="https://code.angularjs.org/1.4.3/angular.js" data-semver="1.4.3"></script> 
 
    <script data-require="[email protected]" data-semver="1.4.3" src="https://code.angularjs.org/1.4.3/angular-resource.js"></script> 
 
    <script src="//rawgit.com/tamtakoe/oi.select/master/dist/select-tpls.js"></script> 
 
    <script src="script.js"></script> 
 
    </head> 
 

 
    <body class="container row"> 
 
    <div ng-app="myApp"> 
 
    <div ng-controller="myCtrl"> 
 
    <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> 
 
    <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> 
 
    </body> 
 

 
</html>