0

ui-routerのバージョンv1.0.0-rc.1とコンポーネント1.6.4を使用しています。ビューが挿入されていないか、または警告:角度が複数回表示されようとしました

アプリケーションルートの縮小バージョンです。各ビューはコンポーネントに関連付けられています。トップバー、サイドバー、およびpageContentはすべてコンポーネントです。

コードがメインビューの下にある方法は、pageContentコンポーネントが挿入されていないため、エラーや警告はありません。しかし、トップバーとサイドバーが注入されます。

それを再現するPlunkerリンク:https://plnkr.co/edit/NedgoYEjkAxaRXRJHSoL?p=preview

// Application routes 
    $stateProvider 
     .state('root', { 
      url: '', 
      abstract: true, 
      views: { 
       topbar: 'topbar', 
       sidebar: 'sidebar' 
      } 
     }) 
     //children of the 'root' route 
     .state('income', { 
      url: '/income', 
      parent: 'root', 
      views: { 
       main: 'pageContent' 
      }, 
      resolve: { 
       selectedModule: function() { 
        return 'income'; 
       } 
      } 
     }) 
     .state('outcome', { 
      url: '/outcome', 
      parent: 'root', 
      views: { 
       main: 'pageContent' 
      }, 
      resolve: { 
       selectedModule: function() { 
        return 'outcome'; 
       } 
      } 
     }); 

これはindex.htmlにある

<ui-view name="topbar"></ui-view> 
<div id="wrapper"> 
    <ui-view name="sidebar"></ui-view> 
    <ui-view name="main"></ui-view> 
</div> 

pageContent.js

(function() { 
    'use strict'; 

    angular.module('up').component('pageContent', { 
     templateUrl: 'app/shared-components/page-content/page-content.component.html', 
     controller: Controller, 
     bindings: { 
      selectedModule: '<' 
     } 
    }); 

    function Controller() {} 

})(); 

pageContent.html(他の構成要素を含みます)

<div id="page-content-wrapper"> 
    <div class="container-fluid"> 
     <div class="row"> 
      <div class="col-md-12 no-padding"> 
       <sidemenu></sidemenu> 
       <operations></operations> 
       <reports></reports> 
      </div> 
     </div> 
    </div> 
</div> 

最後に私が「ルート」のルートを変更した場合:(メインビューにして、空のテンプレートURL)

.state('root', { 
    url: '', 
    abstract: true, 
    views: { 
     topbar: 'topbar', 
     sidebar: 'sidebar', 
     main: { 
      templateUrl: '' 
     } 
    } 
}) 

はその後、私は警告を得る:回角度以上をロードしようとしましたが、すべてが機能し、すべてのビューが注入されます。

jQueryを削除すると、上記の警告は表示されません。しかし、私はjQueryをangle.elementと一緒に使用する必要があります

申し訳ありませんが長いポストですが、私はすべての詳細を述べなければなりませんでした。

+0

あなたはjQueryの_before_ AngularJSをロードしますか? –

+0

はい、警告が表示されていない場合は、読み込んでいます。しかし、私は私が望むようにangular.elementを使用することはできません:*セレクタを介して要素を調べることはjqLit​​eによってサポートされていません!参照:http://docs.angularjs.org/api/angular.element* – fernandodof

+0

このエラーは、それが何を言っているかを正確に意味します。角度を複数回ロードしようとします。問題はこのエラーによって引き起こされるのではなく、矛盾が原因で発生する可能性があります。それは解決するために複製する必要があります。 – estus

答えて

1

通常、<script>タグはテンプレートで解析されません。これは、設計上存在するjqLit​​e実装の単純化です。 this answerで説明したように、Angularより前にjQueryをロードすると、jqLit​​eがjQueryに置き換えられ、<script>ノードを動的に追加できます。 plunkで見

問題は、コードのこの部分でtemplateUrl: ''によって引き起こされる:

.state('root', { 
    url: '', 
    abstract: true, 
    views: { 
     topbar: 'topbar', 
     sidebar: 'sidebar', 
     main: { 
      templateUrl: '' 
     } 
    } 
}) 

これは、DOMへ<script>タグを複製追加し、それらを評価し、テンプレートとしてロードインデックスページになります。 mainビューのコンポーネントがない場合は、viewsには含まれません。

予想される動作についてビューがnaming schemeに従っていない、それはおそらく次のようになります。

.state('income', { 
    url: '/income', 
    parent: 'root', 
    views: { 
     '[email protected]': 'pageContent' 
    }, 
    ... 
+0

ありがとうございました@estusそれは魅力のように動作します。私はrootから* main:{templateUrl: ''} *を削除し、あなたが言ったように子ビューを 'main @'に変更しました。もう一度お返事ありがとうございます。 – fernandodof

+0

私はこの文章を特に文書で見ませんでした – fernandodof

+0

あなたを大歓迎します。このjQuery機能は誤用されると奇妙なバグを引き起こす可能性があることは興味深いことでした。 – estus

関連する問題