0

John Lindquistによるこの youtube チュートリアルに従おうとしました。彼はディレクティブをコンポーネントとコンテナーに分類して説明しています。 そこで、さまざまなアイテム (テキストエリア、画像、ビデオなど) を保持するコンテナー (スライド) を用意しようとしましたが、私の例はより動的です。 彼の例は次のようなものでした:

<panel title="{{title}}">
  <element text="{{body}}"></element>
</panel>

しかし、私のものはもっとこのようなものです:

<slide ng-repeat="slide in slides" slide-id="{{slide.id}}">
  <component
    element="component"
    type="{{component.type}}"
    ng-repeat="component in slide.components"
  >
  </component>
</slide>

コンポーネント ディレクティブ (この SO questionから取得したもの) は、タイプを取得してテンプレートを正しいディレクティブに変更するディレクティブです。たとえば、エディターがこれを変更した場合は、次のようになります。

<component
  element="component"
  type="{{component.type}}"
  ng-repeat="component in slide.components"
>
</component>

これに:

<component
  element="component"
  editor
  ng-repeat="component in slide.components"
>
</component>

そして、エディター ディレクティブは、最後のテンプレートを次のように変更することで機能します。

<div
  contenteditable="true"
  class="editor text-content"
>
  {{element.content.text}}
</div>

しかし、コンポーネントディレクティブがまったく実行されない理由がわかりません。分離されたスコープに何か問題があると思います。何かを理解していない可能性があります。
Plunker での作業例

アップデート:

不足している制限を指摘してくれたMarco Alvesに感謝します。例を最初にリンク関数とコンパイル関数のどちらで記述したかは覚えていませんが、リンク関数を使用したソリューションは次のように見える可能性があるため、コンパイル関数を使用する必要があります。動作していますが、コンソールを開いた後、奇妙なエラーが表示されます(少なくとも私にとっては奇妙です):

エラー: InvalidCharacterError: DOM Exception 5
エラー: XML 名などで、無効または不正な文字が指定されました。
x.extend.attr (jquery.min.js:5:4051)
で Function.x.extend.access (jquery.min.js:4:5847)
で x.fn.extend.attr (jquery.min.js ) :5:715)
リンク (component-directive.js:7:11)
で nodeLinkFn (angular.js:4774:13)
で angular.js:4914:15
で nodeLinkFn (angular.js:4768:24)

angular.js:9782:11で.js:4913:13
(angular.js:7303:59) <div contenteditable="true" class="ng-scope editor text-content ng-binding" element="component" type="" ng-repeat="component in slide.components" editor="">angular.js:6173
(匿名関数) angular.js:6173
(匿名関数) angular.js:5219
nodeLinkFn angular .js:4777
(匿名関数) angular.js:4914
nodeLinkFn angular.js:4768
(匿名関数) angular.js:4913
(匿名関数) angular.js:9782
ラ​​ップされたコールバック angular.js:7303
ラップされたコールバック angular.js:7303
(匿名関数) angular.js:7340
Scope.$eval angular .js:8685
Scope.$digest angular.js:8548
Scope.$apply angular.js:8771
done angular.js:10004
completeRequest angular.js:10180
xhr.onreadystatechange

Marco Alvesからのこの回答を確認してください。 したがって、コンポーネント ディレクティブは次のようになります。

app.directive('component', ['$compile', function($compile){
  return {
    restrict: "E",
    compile:function(tElement, tAttrs){
      var el = tElement[0];
      if(el.getAttribute('type')){
        el.removeAttribute('type');
        el.setAttribute(tAttrs.type,'');
        return function(scope){
          $compile(el)(scope);
        };
      }
    }
  };
}]);

これに関する問題は、このplunker の例では問題なく動作するにもかかわらず、コンポーネント ディレクティブがまだコンパイルされないことです。
事前に感謝します。

4

1 に答える 1

1

手始めに、コンポーネント ディレクティブの restrict プロパティを E に設定するのを忘れていました。これが、コンパイルされない理由です。

編集1:

コンポーネント ディレクティブをレンダリングすることができましたが、まだ追加のエラーがあります。

見てみましょう: http://plnkr.co/edit/ENkWIVUnHubxydWgB4pU?p=preview

編集2:

私はそれを解決したと思います。http://plnkr.co/edit/ENkWIVUnHubxydWgB4pU?p=preview

私が変更され:

  • コンポーネント ディレクティブ定義の「E」属性を削除しました
  • componente ディレクティブ リンカー内で removeAttr を使用して、型とコンポーネントの両方の属性を削除します。
  • component ディレクティブを要素ではなく属性として使用するように index.html を変更しました。
于 2013-04-24T21:01:37.830 に答える