222

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

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

任何人都知道一个简单的解决方法,可以将此输入默认为某些东西并保留ng-model? 我尝试将 ang-bind与默认值一起使用,但这似乎也不起作用。

4

10 回答 10

224

这是期望的行为,您应该在控制器中定义模型,而不是在视图中。

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


function Main($scope) {
  $scope.rootFolders = 'bob';
}
于 2012-05-16T05:17:25.620 回答
189

Vojta 描述了“Angular 方式”,但如果你真的需要完成这项工作,@urbanek 最近发布了一个使用 ng-init 的解决方法:

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

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

于 2012-09-30T00:11:03.873 回答
68

覆盖输入指令似乎确实可以完成这项工作。我对Dan Hunsaker的代码做了一些小改动:

  • $parse().assign()在尝试在没有 ngModel 属性的字段上使用之前添加了对 ngModel 的检查。
  • 更正了assign()函数参数顺序。
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);
      }
    }
  };
});
于 2013-12-11T15:21:46.433 回答
21

角度方式

正确的 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}}

请注意,这也适用于 textareas,并选择下拉菜单。

<textarea name="test" ng-model="toaster.test" init-from-form>hello</textarea>
{{toaster.test}}
于 2014-05-09T13:46:16.670 回答
7

更新:我最初的回答涉及让控制器包含可识别 DOM 的代码,这打破了 Angular 的约定以支持 HTML。@dmackerman 在对我的回答的评论中提到了指令,直到现在我才完全错过了这一点。使用该输入,这是在不破坏 AngularHTML 约定的情况下执行此操作的正确方法:


还有一种方法可以同时获得两者 - 获取元素的值并使用它来更新指令中的模型:

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

接着:

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);
            }
        }
    };
}]);

value您当然可以在将模型设置为其值之前修改上述指令以对属性执行更多操作,包括$parse(attrs.value, scope)value属性视为 Angular 表达式(尽管我个人可能会为此使用不同的 [custom] 属性,因此标准的 HTML 属性始终被视为常量)。

此外,在使数据模板化可用于 ng-model中也有一个类似的问题,这可能也很有趣。

于 2013-06-21T23:13:53.490 回答
7

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

<input type="text"
       id="rootFolder"
       ng-init="rootFolders = 'Bob'"
       ng-model="rootFolders"
       disabled="disabled"
       value="Bob"
       size="40"/>
于 2015-07-24T22:02:08.707 回答
5

这是对早期答案的轻微修改......

不需要 $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;
}]);
于 2014-10-28T04:26:00.697 回答
2

嗨,您可以尝试以下方法初始化模型。

在这里你可以用两种方式初始化文本框的 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>                
于 2016-08-05T06:26:52.920 回答
0

我有类似的问题。我无法value="something"用于显示和编辑。我必须在<input>声明的模型中使用以下命令。

[(ngModel)]=userDataToPass.pinCode

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

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

于 2018-08-31T14:05:37.720 回答
0

问题是您必须将 ng-model 设置为要设置 ng-value/value 的父元素。正如 Angular 所说:

主要用在 input[radio] 和 option 元素上,这样当元素被选中时,该元素(或其选择的父元素)的 ngModel 被设置为绑定值。

例如:这是一个执行的代码:

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

注意:在上述情况下,我已经收到了对 ng-model 和值的 JSON 响应,我只是将另一个属性添加到 JS 对象作为“MarketPeers”。所以模型和价值可能取决于需要,但我认为这个过程会有所帮助,同时拥有 ng-model 和 value 但不在同一个元素上。

于 2016-08-31T20:22:11.947 回答