使用AngularJS,如果我设置一个简单的输入文本框值为如下所示的“bob”。如果添加了ng-model属性,则不显示该值。

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

有人知道一种简单的方法来默认这个输入并保留ng-model吗?我尝试使用默认值ng-bind,但这似乎也不起作用。


当前回答

这是对之前答案的轻微修改。

不需要$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;
}]);

其他回答

嗨,你可以尝试下面的方法与初始化的模型。

这里你可以用两种方式初始化ng-model的文本框

-使用ng-init

-在js中使用$scope

<!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>                

如果你使用AngularJs的ngModel指令,记住value属性的值不会绑定在ngModel字段上。你必须自己初始化它,最好的方法是

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

我也有类似的问题。我不能使用value="something"来显示和编辑。 我必须在<input>中使用下面的命令,同时声明ng模型。

[(ngModel)]=userDataToPass.pinCode

其中,我有对象userDataToPass中的数据列表,我需要显示和编辑的项目是pinCode。

同样的,我参考了这个YouTube视频

这是对之前答案的轻微修改。

不需要$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;
}]);

Angular的方式

Angular正确的做法是写一个单页应用,在表单模板中使用AJAX,然后从模型动态地填充它。默认情况下,模型不是从表单填充的,因为模型是唯一的真实来源。相反,Angular会走另一条路,尝试从模型填充表单。

然而,如果你没有时间从头开始

如果你编写了一个应用程序,这可能涉及一些相当大的架构更改。如果你想用Angular来增强一个已有的表单,而不是从头构造一个完整的单页应用,你可以从表单中提取值,并在链接时使用指令将其存储在作用域中。然后,Angular会将作用域中的值绑定回表单,并保持同步。

使用指令

您可以使用一个相对简单的指令从表单中提取值并将其加载到当前范围中。这里我定义了一个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);
      }
    };
  });

您可以看到,我已经定义了几个回退方法来获得模型名称。你可以将这个指令与ngModel指令结合使用,或者如果你愿意,可以绑定到$scope以外的东西。

像这样使用它:

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

注意,这也适用于文本区域和选择下拉列表。

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