L'attribut AngularJS - Value sur une zone de texte d'entrée est ignoré lorsqu'un modèle ng est utilisé?

en utilisant AngularJS si je mets une valeur de boîte de texte d'entrée simple à quelque chose comme" bob " ci-dessous. La valeur ne s'affiche pas si l'attribut ng-model est ajouté.

    <input type="text"
           id="rootFolder"
           ng-model="rootFolders"
           disabled="disabled"
           value="Bob"
           size="40"/>

Quelqu'un connaît un travail simple autour de cette entrée par défaut à quelque chose et de garder le ng-model ? J'ai essayé d'utiliser un ng-bind avec la valeur par défaut, mais qui ne semble pas fonctionner non plus.

207
demandé sur Robert Koritnik 2012-05-16 03:38:39

10 réponses

C'est le comportement désiré, vous devez définir le modèle dans le contrôleur, pas dans la vue.

<div ng-controller="Main">
  <input type="text" ng-model="rootFolders">
</div>


function Main($scope) {
  $scope.rootFolders = 'bob';
}
212
répondu Vojta 2012-05-16 05:17:25

Vojta décrit la "voie angulaire", mais si vous avez vraiment besoin de faire ce travail, @urbanek a récemment posté une solution de contournement en utilisant ng-init:

<input type="text" ng-model="rootFolders" ng-init="rootFolders='Bob'" value="Bob">

https://groups.google.com/d/msg/angular/Hn3eztNHFXw/wk3HyOl9fhcJ

178
répondu Mark Rajcok 2012-09-30 00:11:03

L'annulation de la directive input semble faire l'affaire. J'ai fait quelques modifications mineures à Dan Hunsaker 's code:

  • a ajouté une vérification pour ngModel avant d'essayer d'utiliser $parse().assign() sur les champs sans attributs ngModel.
  • a corrigé la fonction assign() ordre param.
app.directive('input', function ($parse) {
  return {
    restrict: 'E',
    require: '?ngModel',
    link: function (scope, element, attrs) {
      if (attrs.ngModel && attrs.value) {
        $parse(attrs.ngModel).assign(scope, attrs.value);
      }
    }
  };
});
66
répondu Ivan Breet 2017-12-06 15:04:41

L'angle de façon

la façon angulaire correcte de faire ceci est d'écrire une application d'une seule page, AJAX dans le modèle de formulaire, puis le peupler dynamiquement à partir du modèle. Le modèle n'est pas peuplé à partir de la forme par défaut parce que le modèle est la seule source de vérité. Au lieu de cela Angular va aller dans l'autre sens et essayer de peupler la forme du modèle.

Si toutefois, vous n'avez pas le temps de recommencer à partir de zéro

si vous avoir une application écrite, cela pourrait impliquer des changements architecturaux assez importants. Si vous essayez D'utiliser Angular pour améliorer un formulaire existant, plutôt que de construire une application d'une page entière à partir de zéro, vous pouvez tirer la valeur du formulaire et le stocker dans le cadre au moment du lien En utilisant une directive. Angular va alors lier la valeur de la portée à la forme et la garder synchronisée.

à l'Aide d'une directive

Vous pouvez utiliser un relativement simple directive pour extraire la valeur de la forme et la charger dans le champ d'application actuel. Ici, j'ai défini une directive initFromForm.

var myApp = angular.module("myApp", ['initFromForm']);

angular.module('initFromForm', [])
  .directive("initFromForm", function ($parse) {
    return {
      link: function (scope, element, attrs) {
        var attr = attrs.initFromForm || attrs.ngModel || element.attrs('name'),
        val = attrs.value;
        if (attrs.type === "number") {val = parseInt(val)}
        $parse(attr).assign(scope, val);
      }
    };
  });

vous pouvez voir que j'ai défini quelques retombées pour obtenir un nom de modèle. Vous pouvez utiliser cette directive en conjonction avec la directive ngModel, ou vous lier à quelque chose d'autre que $scope si vous préférez.

utilisez - le comme ceci:

<input name="test" ng-model="toaster.test" value="hello" init-from-form />
{{toaster.test}}

notez que cela fonctionnera aussi avec les textareas, et sélectionnez déroulante.

<textarea name="test" ng-model="toaster.test" init-from-form>hello</textarea>
{{toaster.test}}
21
répondu superluminary 2016-07-26 19:04:04

mise à jour: ma réponse originale consistait à avoir le contrôleur contenant du code DOM-aware, qui casse les conventions angulaires en faveur de HTML. @dmackerman a mentionné des directives dans un commentaire sur ma réponse, et je l'ai complètement manqué jusqu'à maintenant. Avec cette entrée, voici le droit façon de le faire sans briser L'angle ou conventions HTML:


Il ya aussi un façon d'obtenir les deux - saisissez la valeur de l'élément et utilisez-le pour mettre à jour le modèle dans une directive:

<div ng-controller="Main">
    <input type="text" id="rootFolder" ng-model="rootFolders" disabled="disabled" value="Bob" size="40" />
</div>

et ensuite:

app.directive('input', ['$parse', function ($parse) {
    return {
        restrict: 'E',
        require: '?ngModel',
        link: function (scope, element, attrs) {
            if(attrs.value) {
                $parse(attrs.ngModel).assign(scope, attrs.value);
            }
        }
    };
}]);

vous pouvez bien sûr modifier la directive ci-dessus pour en faire plus avec l'attribut value avant de définir le modèle à sa valeur, y compris en utilisant $parse(attrs.value, scope) pour traiter l'attribut value comme une expression angulaire (bien que j'utiliserais probablement un attribut [personnalisé] différent pour cela, personnellement, de sorte que le les attributs HTML standards sont systématiquement traités comme des constantes).

aussi, il y a une question similaire sur À la mise à disposition de données templated dans le ng-modèle qui peut également être d'intérêt.

7
répondu Dan Hunsaker 2017-05-23 12:26:32

si vous utilisez la directive AngularJs ngModel, rappelez-vous que la valeur de value attribut ne se lie pas au champ de ngModel .Vous devez init par vous-même et la meilleure façon de le faire,est

<input type="text"
       id="rootFolder"
       ng-init="rootFolders = 'Bob'"
       ng-model="rootFolders"
       disabled="disabled"
       value="Bob"
       size="40"/>
7
répondu Hazarapet Tunanyan 2015-07-24 22:02:08

il s'agit d'une légère modification par rapport aux réponses précédentes...

il n'y a pas besoin de $parse

angular.directive('input', [function () {
  'use strict';

  var directiveDefinitionObject = {
    restrict: 'E',
    require: '?ngModel',
    link: function postLink(scope, iElement, iAttrs, ngModelController) {
      if (iAttrs.value && ngModelController) {
        ngModelController.$setViewValue(iAttrs.value);
      }
    }
  };

  return directiveDefinitionObject;
}]);
5
répondu dale.lotts 2014-10-28 04:26:00

Salut, vous pouvez essayer les méthodes ci-dessous avec initialiser le modèle.

ici, vous pouvez initialiser ng-modèle de la boîte de texte à double sens

- avec utilisation de ng-init

- Avec l'utilisation de $portée en js

<!doctype html>
 <html >
 <head>
        <title>Angular js initalize with ng-init and scope</title>
        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.8/angular.min.js"></script>
</head>
<body ng-app="app" >
    <h3>Initialize value with ng-init</h3>
    <!-- Initlialize model values with ng-init -->
    <div ng-init="user={fullname:'Bhaskar Bhatt',email:'bhatt.bhaskar88@gmail.com',address:'Ahmedabad'};">
        Name : <input type="text" ng-model="user.fullname" /><br/>
        Email : <input type="text" ng-model="user.email" /><br/>
        Address:<input type="text" ng-model="user.address" /><br/>

    </div>  
    <!-- initialize with js controller scope -->
    <h3>Initialize with js controller</h3>

    <div  ng-controller="alpha">
        Age:<input type="text" name="age" ng-model="user.age" /><br/>
        Experience : <input type="text" name="experience" ng-model="user.exp" /><br/>
        Skills : <input type="text" name="skills" ng-model="user.skills" /><br/>
    </div>  

</body> 
<script type="text/javascript">
        angular.module("app",[])
        .controller("alpha",function($scope){
            $scope.user={};
            $scope.user.age=27;
            $scope.user.exp="4+ years";
            $scope.user.skills="Php,javascript,Jquery,Ajax,Mysql";
        });

     </script>
 </html>                
0
répondu Bhaskar Bhatt 2016-08-05 06:26:52

Le problème est que vous devez définir la ng-modèle à l'élément parent de l'endroit où vous souhaitez définir le ng-valeur/valeur . Comme indiqué par Angular:

il est principalement utilisé sur les éléments d'entrée[radio] et d'option, de sorte que lorsque l'élément est sélectionné, le ngModel de cet élément (ou son élément parent sélectionné) est défini à la valeur liée.

Eg: C'est un code exécuté:

<div class="col-xs-12 select-checkbox" >
<label style="width: 18em;" ng-model="vm.settingsObj.MarketPeers">
  <input name="radioClick" type="radio"  ng-click="vm.setPeerGrp('market');" 
         ng-value="vm.settingsObj.MarketPeers" 
         style="position:absolute;margin-left: 9px;">
  <div style="margin-left: 35px;color: #717171e8;border-bottom: 0.5px solid #e2e2e2;padding-bottom: 2%;">Hello World</div>
</label>
</div>

Remarque: Dans ce cas ci-dessus, j'ai déjà eu la réponse JSON au modèle ng-et la valeur, je suis juste ajouter une autre propriété à L'objet JS en tant que "MarketPeers". Donc, le modèle et la valeur peuvent dépendre selon le besoin, mais je pense que ce processus aidera, d'avoir à la fois le modèle ng et la valeur mais ne pas les avoir sur le même élément.

0
répondu sg28 2016-08-31 20:46:02

j'ai eu un problème similaire. Je n'ai pas pu utiliser value="something" pour afficher et éditer. J'ai dû utiliser la commande ci-dessous à l'intérieur de mon <input> avec un modèle déclaré.

[(ngModel)]=userDataToPass.pinCode

où j'ai la liste de données dans l'objet userDataToPass et l'élément que je dois afficher et modifier est pinCode .

pour le même, j'ai fait référence à cette vidéo YouTube

0
répondu tkrloltkr 2018-08-31 14:05:37