検索

AngularJS スコープの使用方法

May 29, 2018 am 11:47 AM
angularjsjavascript範囲

今回はAngularJSスコープの使い方と、AngularJSスコープを使用する際の注意点を紹介します。実際の事例を見てみましょう。

問題の紹介

Angular を開発期間中に使用すると、基本的に次のような落とし穴に遭遇します:

<p>
 </p><p>{{name}}</p>
 <p>
  <input>
 </p>

<script>
function TestCtrl($scope){
  $scope.show = true;
  $scope.name = &#39;htf&#39;;
}
</script>

p 要素と input code> 要素は同じ変数にバインドされています。入力ボックスに内容を入力すると、それに応じて <code>p に表示される内容が変更されると思われるでしょう。 p 元素和 input 元素绑定同一个变量,你本以为,在输入框输入内容,p 中显示的肯定也是随之变化的。

然而并不是这样,不管 input 中的元素怎么变, p 元素中的都没变化,WTF。

要说这是什么原因,那就要从 Angular 的作用域说起了。

作用域

每个 Angular 应用默认有一个根作用域 $rootScope, 根作用域位于最顶层,从它往下挂着各级作用域。

通常情况下,页面中 ng-model 绑定的变量都是在对应的 Controller 中定义的。如果一个变量未在当前作用域中定义,JavaScript 会通过当前 Controller 的 prototype 向上查找,也就是作用域的继承。

这又分两种情况。

1. 基本类型变量

<p>
 </p><p>{{x}}</p>
 <p>
  <input>
 </p>

<script>
function OuterCtrl($scope){
  $scope.x = &#39;hello&#39;;
}
function InnerCtrl($scope){
}
</script>

运行后会发现跟文章开头一样的问题,里面输入框变了,外面的没跟着变。

原因在于,InnerCtrl 中并未定义 x 这个变量,取值的时候,会沿着原型链向上找,找到了 OuterCtrl 中定义的 x ,然后赋值给自己,在 InnerCtrl 的输入框输入值时,改变的是 InnerCtrl 中的 x ,而对 OuterCtrl 中的 x 无影响。此时,两个 x 是独立的。

不过,如果你不嫌麻烦的话,用 $scope.$parent 可以绑定并影响上一层作用域中的基本变量:

<input>

2. 引用类型变量

那么,如果上下级作用域想共用变量怎么办呢?

答案是使用引用类型变量。

 

{{x}}

 

  <input>  

<script> function OuterCtrl($scope){ $scope.data = {}; $scope.data.x = &#39;hello&#39;; } function InnerCtrl($scope){ } </script>

在这种情况下,两者的 data 是同一个引用,对这个对象上面的属性修改,是可以反映到两级对象上的。

ng-if中的作用域

前面讲的是两级控制器之间的作用域,那跟前面提到的问题有什么关系呢?那个看着不是只有一个 Controller 吗?

其实,并不是只有 Controller 可以创建作用域,ng-if 等指令也会(隐式地)产生新作用域。

总结下来就是,ng-ifng-switchng-<a href="http://www.php.cn/wiki/137.html" target="_blank">include</a> 等会动态创建一块界面的东西,都是自带一级作用域。

因此,在开发过程中,为了避免模板中的变量歧义,应当尽可能使用命名限定,比如 data.x,出现歧义的可能性就比单独的 x

しかし、これは当てはまりません。input の要素がどのように変化しても、p の要素は変化しません。

この理由について話すには、Angular のスコープから始めなければなりません。

スコープ

すべての Angular アプリケーションには、デフォルトでルート スコープ $rootScope があり、ルート スコープはそれからぶら下がっています。 通常、ページ内の ng-model にバインドされている変数は、対応するコントローラーで定義されます。現在のスコープで変数が定義されていない場合、JavaScript
は現在のコントローラのプロトタイプを介して検索します。 、これもスコープの継承です。

🎜これは2つの状況に分けられます。 🎜🎜🎜1. 基本型変数🎜🎜rrreee🎜 実行すると、記事の冒頭と同じ問題が発生しますが、外側は変わっていません。 🎜🎜その理由は、変数 xInnerCtrl で定義されていないためです。値を取得するときに、プロトタイプ チェーンに沿って検索し、OuterCtrl を見つけます。 InnerCtrl で定義されているコード >x を入力し、それ自体に値を割り当てます。 InnerCtrl の入力ボックスに値を入力すると、変更されるのはInnerCtrl x の ですが、<code>OuterCtrlx には影響しません。この時点では、2 つの x は独立しています。 🎜🎜ただし、面倒でも構わない場合は、$scope.$parent を使用して、上位スコープの基本変数をバインドして影響を与えることができます: 🎜rrreee🎜🎜2. 参照型変数🎜 🎜 🎜では、上位レベルのスコープと下位レベルのスコープで変数を共有したい場合はどうすればよいでしょうか? 🎜🎜その答えは、参照型変数を使用することです。 🎜rrreee🎜 この場合、2 つの data は同じ参照であり、このオブジェクトのプロパティの変更は 2 レベルのオブジェクトに反映されます。 🎜🎜🎜🎜ng-if スコープ 🎜🎜🎜🎜 先ほど説明したのは、2 レベルのコントローラについてです。 🎜、それは前述の問題と何の関係がありますか?コントローラーが1つしかないように見えませんか? 🎜🎜実際、コントローラーがスコープを作成できるだけでなく、ng-if などのディレクティブも (暗黙的に) 新しいスコープを生成します。 🎜🎜要約すると、ng-ifng-switchng-<a href="http://www.php.cn/wiki/%20137%5D%20.html" target="_blank">include🎜</a> や、インターフェースを動的に作成するその他のものはすべて、独自の第 1 レベルのスコープを持っています。 🎜🎜 したがって、開発プロセスでは、テンプレート内の変数の曖昧さを避けるために、 data.x などの名前付け修飾をできるだけ使用する必要があります。個別の x ははるかに少なくなります。 🎜🎜この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、php 中国語 Web サイトの他の関連記事に注目してください。 🎜🎜推奨読書: 🎜🎜🎜Koa2を使用してWeChat QRコードスキャン決済を開発する方法🎜🎜🎜🎜🎜 AngularJSを使用してタブ切り替えを実装する方法🎜🎜🎜

以上がAngularJS スコープの使用方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
JavaScriptとWeb:コア機能とユースケースJavaScriptとWeb:コア機能とユースケースApr 18, 2025 am 12:19 AM

Web開発におけるJavaScriptの主な用途には、クライアントの相互作用、フォーム検証、非同期通信が含まれます。 1)DOM操作による動的なコンテンツの更新とユーザーインタラクション。 2)ユーザーエクスペリエンスを改善するためにデータを提出する前に、クライアントの検証が実行されます。 3)サーバーとのリフレッシュレス通信は、AJAXテクノロジーを通じて達成されます。

JavaScriptエンジンの理解:実装の詳細JavaScriptエンジンの理解:実装の詳細Apr 17, 2025 am 12:05 AM

JavaScriptエンジンが内部的にどのように機能するかを理解することは、開発者にとってより効率的なコードの作成とパフォーマンスのボトルネックと最適化戦略の理解に役立つためです。 1)エンジンのワークフローには、3つの段階が含まれます。解析、コンパイル、実行。 2)実行プロセス中、エンジンはインラインキャッシュや非表示クラスなどの動的最適化を実行します。 3)ベストプラクティスには、グローバル変数の避け、ループの最適化、constとletsの使用、閉鎖の過度の使用の回避が含まれます。

Python vs. JavaScript:学習曲線と使いやすさPython vs. JavaScript:学習曲線と使いやすさApr 16, 2025 am 12:12 AM

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

Python vs. JavaScript:コミュニティ、ライブラリ、リソースPython vs. JavaScript:コミュニティ、ライブラリ、リソースApr 15, 2025 am 12:16 AM

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

C/CからJavaScriptへ:すべてがどのように機能するかC/CからJavaScriptへ:すべてがどのように機能するかApr 14, 2025 am 12:05 AM

C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

JavaScriptエンジン:実装の比較JavaScriptエンジン:実装の比較Apr 13, 2025 am 12:05 AM

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

ブラウザを超えて:現実世界のJavaScriptブラウザを超えて:現実世界のJavaScriptApr 12, 2025 am 12:06 AM

現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。

next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)Apr 11, 2025 am 08:23 AM

私はあなたの日常的な技術ツールを使用して機能的なマルチテナントSaaSアプリケーション(EDTECHアプリ)を作成しましたが、あなたは同じことをすることができます。 まず、マルチテナントSaaSアプリケーションとは何ですか? マルチテナントSaaSアプリケーションを使用すると、Singの複数の顧客にサービスを提供できます

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール