0

templateUrl と link プロパティを含む DDO を返すディレクティブがあります。私のtemplateUrlには、チェックボックス要素を含むdivにngRepeatディレクティブが含まれています。私のリンク関数では、すべての子チェックボックスを選択しようとしていますが、リンク関数が呼び出されたときに DOM に追加されません。選択を $timeout でラップすると、もちろんチェックボックスが選択されます。ドキュメントによると、角度は次の順序で関数を呼び出します。

mainDirective->compile->preLink -> firstChildDirective->compile->preLink -> lastChildDirective->compile->preLink->postLink -> firstChildDirective->postLink -> mainDirective->postLink。

リンクプロパティでDDOを返す場合、Angularのドキュメントによると、それはpostLinkとして呼び出されます。これは、私の意見では、すべての子チェックボックスがすでにDOMにあるはずですが、そうではありません。

angular コードを見ると、これはコンパイル関数があり、templateUrl がない場合に当てはまることがわかります。

    if (directive.templateUrl) {
      assertNoDuplicate('template', templateDirective, directive, $compileNode);
      templateDirective = directive;
      nodeLinkFn = compileTemplateUrl(directives.splice(i, directives.length - i),
          nodeLinkFn, $compileNode, templateAttrs, jqCollection, directive.replace,
          childTranscludeFn);
      ii = directives.length;
    } else if (directive.compile) {
      try {
        linkFn = directive.compile($compileNode, templateAttrs, childTranscludeFn);
        if (isFunction(linkFn)) {
          addLinkFns(null, linkFn);
        } else if (linkFn) {
          addLinkFns(linkFn.pre, linkFn.post);
        }
      } catch (e) {
        $exceptionHandler(e, startingTag($compileNode));
      }
    }

また、link プロパティがあり、templateUrl ディレクティブ.compile がディレクティブ.link に割り当てられている場合。

templateUrl がない場合に addLinkFns(null, linkFn) がリンク関数を postLink にバインドすることは明らかですが、いくつかの子ディレクティブを含む templateUrl がある場合はどうなりますか。リンク関数が呼び出されているときに子チェックボックスが使用できないのはなぜですか? ご協力ありがとうございました!!!

4

1 に答える 1

0

1 つ忘れていることがあります。ディレクティブは静的である必要はありません。モデルの変更に対応できます。そして、それが何をするかng-repeatです。モデルが評価されると、要素が作成/削除されます。たとえば、アイテムは実行時に追加できます。その場合、ディレクティブがリンクされているときにチェックボックスが DOM にある可能性は明らかにありません。

于 2014-01-11T15:34:50.497 に答える