angularJSの&vs @と=の違いは何ですか


回答:


375

@ディレクティブ属性で定義された値をディレクティブの分離スコープに渡すことができます。値は、単純な文字列値(myattr="hello")にすることも、式が埋め込まれたAngularJS補間文字列()にすることもできますmyattr="my_{{helloText}}"。親スコープから子ディレクティブへの「一方向」の通信と考えてください。John Lindquistは、これらのそれぞれを説明する一連の短いスクリーンキャストを公開しています。@のスクリーンキャストはこちら:https : //egghead.io/lessons/angularjs-isolate-scope-attribute-binding

&ディレクティブの分離スコープが値を親スコープに渡して、属性で定義された式で評価できるようにします。ディレクティブ属性は暗黙的に式であり、二重中括弧式構文を使用しないことに注意してください。これはテキストで説明するのが難しいです。&のスクリーンキャストはこちら:https : //egghead.io/lessons/angularjs-isolate-scope-expression-binding

=ディレクティブの分離スコープと親スコープの間に双方向バインディング式を設定します。子スコープでの変更は親に伝達され、その逆も同様です。=は@と&の組み合わせと考えてください。=のスクリーンキャストはこちら:https : //egghead.io/lessons/angularjs-isolate-scope-two-way-binding

そして最後に、3つすべてを1つのビューで一緒に使用することを示すスクリーンキャストがあります:https : //egghead.io/lessons/angularjs-isolate-scope-review



1
コールアウトをありがとう、正しいURLで回答を更新しました。
cliff.meyers 2014年

43
おそらく同じ情報を含む無料のコンテンツが大量に出回っているのに、最高評価の回答が有料の壁の裏にある動画にリンクしているのは少し残念です。
BenCr

eggheadによって無料で提供されているビデオがたくさんあります:)
Vatsal

7
有料コンテンツの場合はマイナス1。
Arel Sapir 2017

109

JavaScriptプロトタイプ継承の観点から概念を説明したいと思います。うまくいけば、理解するのに役立ちます。

ディレクティブのスコープを定義するには、3つのオプションがあります。

  1. scope: false:角度のデフォルト。ディレクティブのスコープは、その親スコープ(parentScope)の1つです。
  2. scope: true:Angularはこのディレクティブのスコープを作成します。スコープはプロトタイプ的にから継承しparentScopeます。
  3. scope: {...}:分離スコープについて以下に説明します。

指定 scope: {...}すると、が定義されますisolatedScope。アンはisolatedScopeからプロパティを継承しないparentScopeもののを、isolatedScope.$parent === parentScope。これは、次のように定義されます。

app.directive("myDirective", function() {
    return {
        scope: {
            ... // defining scope means that 'no inheritance from parent'.
        },
    }
})

isolatedScopeに直接アクセスできませんparentScope。ただし、ディレクティブはと通信する必要がある場合がありますparentScope。彼らは@=&シンボルの使用に関するトピック@=および&を使用しisolatedScopeシナリオについての話です。

これは通常、モーダルなど、さまざまなページで共有されるいくつかの一般的なコンポーネントに使用されます。分離されたスコープは、グローバルスコープの汚染を防ぎ、ページ間での共有が簡単です。

基本的なディレクティブは次のとおりです。 http //jsfiddle.net/7t984sf9/5/。説明するイメージは次のとおりです。

ここに画像の説明を入力してください

@:一方向バインディング

@プロパティをからparentScopeに渡すだけですisolatedScopeです。これはと呼ばれます。one-way bindingつまり、parentScopeプロパティの値を変更することはできません。JavaScriptの継承に慣れている場合は、次の2つのシナリオを簡単に理解できます。

  • interpolatedProp例のように、バインディングプロパティがプリミティブ型の場合:変更できますinterpolatedPropparentProp1変更されません。しかし、あなたがの値を変更した場合parentProp1interpolatedProp(角$ダイジェストとき)新しい値で上書きされます。

  • バインディングプロパティが次のようなオブジェクトの場合parentObjisolatedScope参照であるため、値を変更するとこのエラーがトリガーされます。

    TypeError: Cannot assign to read only property 'x' of {"x":1,"y":2}

=:双方向バインディング

=はと呼ばれますtwo-way binding。つまり、の変更childScopeにより、の値も更新されますparentScope。このルールは、プリミティブとオブジェクトの両方に機能します。のバインディングタイプをparentObj=変更すると、の値を変更できることがわかりますparentObj.x。典型的な例はngModelです。

&:関数バインディング

&ディレクティブがparentScope関数を呼び出し、ディレクティブから値を渡すことを許可します。たとえば、JSFiddle:&ディレクティブスコープを確認します

次のようなディレクティブでクリック可能なテンプレートを定義します。

<div ng-click="vm.onCheck({valueFromDirective: vm.value + ' is from the directive'})">

次のようなディレクティブを使用します。

<div my-checkbox value="vm.myValue" on-check="vm.myFunction(valueFromDirective)"></div>

変数 valueFromDirectiveは、を介してディレクティブから親コントローラーに渡され{valueFromDirective: ...ます。

リファレンス:スコープについて


デフォルトでは、ディレクティブは共有スコープを使用します。ディレクティブに「scope:true」がある場合、継承されたスコープが使用され、子は親プロパティを表示できますが、親は子内部プロパティを表示できません。
YuMei 2015

1
AngularJS –分離スコープ– @ vs = vs& ----------説明付きの短い例は以下のリンクにあります: codeforeach.com/angularjs/angularjs-isolated-scopes-vs-vs
Prashanth

24

私のフィドルではなく、http://jsfiddle.net/maxisam/QrCXh/が違いを示しています。重要な部分は次のとおりです。

           scope:{
            /* NOTE: Normally I would set my attributes and bindings
            to be the same name but I wanted to delineate between 
            parent and isolated scope. */                
            isolatedAttributeFoo:'@attributeFoo',
            isolatedBindingFoo:'=bindingFoo',
            isolatedExpressionFoo:'&'
        }        

17

@:一方向バインディング

=:双方向バインディング

:関数バインディング


5
@に対する重要な警告は、一方向だけではなく、途中の文字列です
Shawson '28

@Shawson:では、一方向の非文字列(たとえば、intまたはbool)をバインドする方法は?
またはMapper

あなたの心がそれに設定されている場合、@から値を取得し、キャストはint / boolにできますか?それ以外の場合は、=または<を使用するだけです
Shawson

7

AngularJS –分離スコープ– @ vs = vs&


説明付きの短い例は、以下のリンクから入手できます。

http://www.codeforeach.com/angularjs/angularjs-isolated-scopes-vs-vs

@ –一方向バインディング

ディレクティブで:

scope : { nameValue : "@name" }

ビューで:

<my-widget name="{{nameFromParentScope}}"></my-widget>

= –双方向バインディング

ディレクティブで:

scope : { nameValue : "=name" },
link : function(scope) {
  scope.name = "Changing the value here will get reflected in parent scope value";
}

ビューで:

<my-widget name="{{nameFromParentScope}}"></my-widget>

&–関数呼び出し

ディレクティブで:

scope : { nameChange : "&" }
link : function(scope) {
  scope.nameChange({newName:"NameFromIsolaltedScope"});
}

ビューで:

<my-widget nameChange="onNameChange(newName)"></my-widget>

5

これを本当に手に入れるのに長い時間がかかりました。私にとって重要なのは、 "@"がその場で評価され、 "="が実際にオブジェクト自体を渡す定数としてディレクティブに渡されるものであることを理解することでした。

これを説明する素晴らしいブログ投稿があります:http : //blog.ramses.io/technical/AngularJS-the-difference-between-@-&-and-=-when-declaring-directives-using-isolate-scopes

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.