为什么有的要写在link里面,有的要写在controller里面?! 如果希望在module中设置一个子scope,但不用directive,这时候能否用link? (比如说用ngRoute时候的ng-view部分,可否用link) controller可以和服务器端通信是吧,link好像不干这事情?还是只是我没见到过?
认证高级PHP讲师
ディレクティブのリンクとコントローラーの違いについて? 1. 実行順序: 最初にコントローラー、次にリンク 2. コントローラーを使用する場合: 一般的なシナリオでは、コントローラーを使用する必要はなく、リンクにロジックを記述するだけで済みます。コントローラーが使用されるシナリオでは、命令 (と想定されます) が必要になります。他の命令(bとする)で実行した場合、b命令のlink関数でこのコントローラを渡します(requireが複数ある場合は配列を渡し、各require命令に対応するコントローラを格納します)配列) の目的は明らかに命令間の通信です。
非ディレクティブスコープにリンクを使用できますか? リンクは命令内でのみ呼び出されます。つまり、コンパイル後に命令がスコープにバインドされるときにリンクが呼び出されます。 リンクは命令が定義されている場所でのみ使用されます。たとえば、ポップアップ ボックスを作成する場合は、テンプレート tpl を取得してから var linkFn = $compile(angular.element(tpl));此时返回的就是一个link的函数,然后linkFn(scope) を呼び出す必要があります。指定する必要があるスコープは、新規に作成したものでも、既存のものでも構いません。
var linkFn = $compile(angular.element(tpl));
linkFn(scope)
リンクとコントローラーは全く関係のない概念です。
特定のディレクティブの場合、リンクはより複雑であり、基本的に angularjs の場合は、ディレクティブを最初にコンパイルする必要があります ---> $compile を呼び出して dom を生成します。オブジェクト ---> ; リンクを呼び出して、対応するスコープにバインドします ---> $digest をトリガーします (その後、ディレクティブを更新するための多くのステップがあります。オブジェクトごとにコンパイル時間とタイミングが異なります。詳細については API を参照してください) )
つまり、コンパイル、リンクなどはすべて方向性を考慮したものです。対象者が jquery に精通している場合、コンパイル プロセスはいくつかの dom オブジェクト ($('<a class = //.... ') を作成するのと同じです。 ) ) link は、$().append や prepend などの dom 操作です。
では、スコープとは何ですか?スコープはモデルをバインドするために使用されます。 コントローラーとは何ですか? メソッド (ロジック) をスコープに追加するために使用されます。
link は DOM にディレクティブを埋め込むために AngularJS によって提供されるアスペクトメカニズムです。Controller はスコープ内の watch イベントがトリガーされたときのコンテキストであり、これはまったく異なります。
最後の質問に関しては、関数が実行できる限り、作成したコードは実行できますが、一般的に言えば 1) ビジネスロジックをコントローラーに書きます。ディレクティブ自体のコントローラーではなく、バインドされているスコープのコントローラーに書きます
2) コントローラー内で DOM 操作、特に prepend と append を行わないでください。これは、コンパイルされていない DOM オブジェクトは監視できず、angularjs は後で追加されコンパイルされていない DOM オブジェクトを監視しないためです。
ディレクティブのリンクとコントローラーの違いについて?
1. 実行順序: 最初にコントローラー、次にリンク
2. コントローラーを使用する場合: 一般的なシナリオでは、コントローラーを使用する必要はなく、リンクにロジックを記述するだけで済みます。コントローラーが使用されるシナリオでは、命令 (と想定されます) が必要になります。他の命令(bとする)で実行した場合、b命令のlink関数でこのコントローラを渡します(requireが複数ある場合は配列を渡し、各require命令に対応するコントローラを格納します)配列) の目的は明らかに命令間の通信です。
非ディレクティブスコープにリンクを使用できますか?
リンクは命令内でのみ呼び出されます。つまり、コンパイル後に命令がスコープにバインドされるときにリンクが呼び出されます。
リンクは命令が定義されている場所でのみ使用されます。たとえば、ポップアップ ボックスを作成する場合は、テンプレート tpl を取得してから
var linkFn = $compile(angular.element(tpl));
此时返回的就是一个link的函数,然后linkFn(scope)
を呼び出す必要があります。指定する必要があるスコープは、新規に作成したものでも、既存のものでも構いません。リンクとコントローラーは全く関係のない概念です。
特定のディレクティブの場合、リンクはより複雑であり、基本的に angularjs の場合は、ディレクティブを最初にコンパイルする必要があります ---> $compile を呼び出して dom を生成します。オブジェクト ---> ; リンクを呼び出して、対応するスコープにバインドします ---> $digest をトリガーします (その後、ディレクティブを更新するための多くのステップがあります。オブジェクトごとにコンパイル時間とタイミングが異なります。詳細については API を参照してください) )
つまり、コンパイル、リンクなどはすべて方向性を考慮したものです。対象者が jquery に精通している場合、コンパイル プロセスはいくつかの dom オブジェクト ($('<a class = //.... ') を作成するのと同じです。 ) ) link は、$().append や prepend などの dom 操作です。
では、スコープとは何ですか?スコープはモデルをバインドするために使用されます。
コントローラーとは何ですか? メソッド (ロジック) をスコープに追加するために使用されます。
link は DOM にディレクティブを埋め込むために AngularJS によって提供されるアスペクトメカニズムです。Controller はスコープ内の watch イベントがトリガーされたときのコンテキストであり、これはまったく異なります。
最後の質問に関しては、関数が実行できる限り、作成したコードは実行できますが、一般的に言えば
1) ビジネスロジックをコントローラーに書きます。ディレクティブ自体のコントローラーではなく、バインドされているスコープのコントローラーに書きます
2) コントローラー内で DOM 操作、特に prepend と append を行わないでください。これは、コンパイルされていない DOM オブジェクトは監視できず、angularjs は後で追加されコンパイルされていない DOM オブジェクトを監視しないためです。