ng-modelとng-bindの違いは何ですか


554

私は現在、AngularJSを学んだし、間の違いを理解する難しさを持っていますng-bindng-model

誰が私にそれらの違いを教えてくれますか?

回答:


831

ng-bindには一方向のデータバインディングがあります($ scope-> view)。変数名であるhtmlに挿入され{{ val }} たスコープ値を表示するショートカットがあります。$scope.valval

ng-modelはフォーム要素の内部に配置することを目的としており、双方向のデータバインディング($ scope->ビューおよびビュー-> $ scope)を持ってい<input ng-model="val"/>ます。


80
tosh、ありがとう。ng-bindは、表示する値がユーザー入力を必要としない場合にのみ必要であると言うのは公正な仮定でしょうか。そして、ng-modalは、そうする値(<input>)に使用されます。角度のあるドキュメントはこれを示唆しているようですが、私は理解を深めています。
ダブ

24
@Marc実際には、ng-bindは、値ではなく要素のテキストコンテンツをバインドします。このため、<input>要素では使用できません。
trogdor 2013

21
@Marc、その場合は次のように使用します:<input type = "text" value = "{{prop}}" />
John

3
@JakubBarczyk {{:: va}}は1回限りのバインディングであり、一方向ではありません。
Vlad Bezden、2015年

2
@Wachburn一方向ですが、より重要なのは一回です。モデルが値を取得すると、モデルの変更の監視を停止します。したがって、通常の一方向バインディングが必要な場合は、一方向バインディングとして使用できません。
Ruslan Stelmachenko

141

toshの答えは問題の核心にうまく行きます。ここにいくつかの追加情報があります...

フィルターとフォーマッター

ng-bindそして、ng-modelの両方がユーザーのためにそれを出力する前にデータを変換するという概念を持っています。そのために、ng-bindフィルターng-model使用し、フォーマッターは使用します。

フィルター(ng-bind)

ではng-bindフィルタを使用してデータを変換できます。例えば、

<div ng-bind="mystring | uppercase"></div>

またはもっと簡単に:

<div>{{mystring | uppercase}}</div>

uppercase内蔵の角度フィルタであるあなたにもできますが、独自のフィルタを構築します

フォーマッター(ng-model)

ng-modelフォーマッタを作成するにはrequire: 'ngModel'、するディレクティブを作成します。これにより、そのディレクティブがngModelのにアクセスできるようになりますcontroller。例えば:

app.directive('myModelFormatter', function() {
  return {
    require: 'ngModel',
    link: function(scope, element, attrs, controller) {
     controller.$formatters.push(function(value) {
        return value.toUpperCase();
      });
    }
  }
}

次に、部分的に:

<input ngModel="mystring" my-model-formatter />

これは基本的に、上記の例でフィルターが行っているng-modelことと同等です。uppercase ng-bind


パーサー

では、ユーザーが値を変更できるようにする場合はmystringどうでしょうか。モデル -> ビューng-bindからの片方向バインディングのみ。ただし、ビュー -> モデルからバインドできます。つまり、ユーザーがモデルのデータを変更できるようにし、パーサーを使用してユーザーのデータを合理化された方法でフォーマットできます。これは次のようになります。ng-model

app.directive('myModelFormatter', function() {
  return {
    require: 'ngModel',
    link: function(scope, element, attrs, controller) {
     controller.$parsers.push(function(value) {
        return value.toLowerCase();
      });
    }
  }
}

ng-modelフォーマッター/パーサーの例のライブプランカーを試す


ほかに何か?

ng-model検証機能も組み込まれています。単にあなたの変更$parsersまたは$formatters呼び出すための機能をngModelcontroller.$setValidity(validationErrorKey, isValid)機能

Angular 1.3には、$parsersまたはの代わりに検証に使用できる新しい$ validators配列があります$formatters

Angular 1.3はngModelのゲッター/セッターもサポートしています


7
+ 1.追加情報をありがとう。迅速な回答(Tosh's)があり、推論/使用例についてより多くを学び/理解するために、あなたのような詳細なWHY&HOWの回答を持つことは常に良い/素晴らしいです。
redfox05 2015年

30

ngModel

ngModelディレクティブは、入力、選択、テキストエリア(またはカスタムフォームコントロール)をスコープのプロパティにバインドします。

このディレクティブは優先度1で実行されます。

プランカーの

ジャバスクリプト

angular.module('inputExample', [])
   .controller('ExampleController', ['$scope', function($scope) {
     $scope.val = '1';
}]);

CSS

.my-input {
    -webkit-transition:all linear 0.5s;
    transition:all linear 0.5s;
    background: transparent;
}
.my-input.ng-invalid {
    color:white;
    background: red;
}

HTML

<p id="inputDescription">
   Update input to see transitions when valid/invalid.
   Integer is a valid value.
</p>
<form name="testForm" ng-controller="ExampleController">
    <input ng-model="val" ng-pattern="/^\d+$/" name="anim" class="my-input"
         aria-describedby="inputDescription" />
</form>

ngModelは以下の責任を負います:

  • ビューをモデルにバインドします。入力、テキストエリア、選択などの他のディレクティブが必要とします。
  • 検証動作を提供します(つまり、必須、番号、電子メール、URL)。
  • コントロールの状態を維持します(有効/無効、ダーティ/プリスティン、タッチ/非タッチ、検証エラー)。
  • アニメーションを含む要素(ng-valid、ng-invalid、ng-dirty、ng-pristine、ng-touched、ng-untouched)に関連するCSSクラスを設定します。
  • コントロールをその親フォームに登録します。

ngBind

ngBind属性は、指定されたHTML要素のテキストコンテンツを特定の式の値で置き換え、その式の値が変更されたときにテキストコンテンツを更新するようにAngularに指示します。

このディレクティブは優先度0で実行されます。

プランカーの

ジャバスクリプト

angular.module('bindExample', [])
    .controller('ExampleController', ['$scope', function($scope) {
    $scope.name = 'Whirled';
}]);

HTML

<div ng-controller="ExampleController">
  <label>Enter name: <input type="text" ng-model="name"></label><br>
  Hello <span ng-bind="name"></span>!
</div>

ngBindは次のことを担当します。

  • 指定されたHTML要素のテキストコンテンツを、指定された式の値で置き換えます。

私はこの完全な回答に感謝しますが、以前に選択した回答は、違いを理解するのに十分な情報を提供しただけなので、残ります。
2015

8

ng-bindまたはの使用をためらっている場合はng-model、次の質問に答えてみてください。


データを表示するだけで済みますか?

  • はい:(ng-bind 一方向バインディング)

  • いいえ:(ng-model 双方向バインディング)

(値ではなく)テキストコンテンツバインドする必要がありますか?

  • はい: ng-bind

  • いいえ:(ng-model 値が必要な場合はng-bindを使用しないでください)

タグはHTML <input>ですか?

  • はい:(タグでng-model ng-bindを使用することはできません<input>

  • 番号: ng-bind


6

ng-model

AngularJSのng-modelディレクティブは、アプリケーションで使用される変数を入力コンポーネントにバインドする最大の強みの1つです。これは双方向のデータバインディングとして機能します。双方向バインディングについて理解を深めるには、入力コンポーネントがあり、そのフィールドに更新された値をアプリケーションの他の部分に反映する必要があります。より良い解決策は、変数をそのフィールドにバインドし、アプリケーションで更新された値を表示する場所に変数を出力することです。

ng-bind

ng-bindの動作はng-modelとは大きく異なります。ng-bindは、htmlコンポーネント内の値を内部HTMLとして表示するために使用される一方向のデータバインディングです。このディレクティブは、変数とのバインドには使用できませんが、HTML要素のコンテンツにのみ使用できます。実際には、これをng-modelとともに使用して、コンポーネントをHTML要素にバインドできます。このディレクティブは、div、spanなどのブロックを内部HTMLコンテンツで更新するのに非常に役立ちます。

この例は、理解するのに役立ちます。


5

angular.module('testApp',[]).controller('testCTRL',function($scope)
                               
{
  
$scope.testingModel = "This is ModelData.If you change textbox data it will reflected here..because model is two way binding reflected in both.";
$scope.testingBind = "This is BindData.You can't change this beacause it is binded with html..In above textBox i tried to use bind, but it is not working because it is one way binding.";            
});
div input{
width:600px;  
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<head>Diff b/w model and bind</head>
<body data-ng-app="testApp">
    <div data-ng-controller="testCTRL">
        Model-Data : <input type="text" data-ng-model="testingModel">
        <p>{{testingModel}}</p>
          <input type="text" data-ng-bind="testingBind">
          <p ng-bind="testingBind"></p>
    </div>
</body>


2

ngModelは通常、コントローラーとhtmlページから変数を変更できる変数をバインドするための入力タグに使用しますが、ngBindはhtmlページに変数を表示するために使用し、コントローラーとhtml変数だけを表示して変数を変更できます。


1

<p>表示にng-bindを使用できます。のショートカットを使用できますng-bind {{model}}。html入力コントロールでng-bindを使用できませんが、html入力コントロールでを使用できng-bind {{model}}ます。

<input type="text" ng-model="name" placeholder="Enter Something"/>
<input type="text" value="{{name}}" placeholder="Enter Something"/>
  Hello {{name}}
<p ng-bind="name"</p>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.