2016-06-20 5 views
1

toStateui-srefの値に一致するとliのスタイルプロパティを変更するangularJS指示があります。element.find( 'li')が結果と一致しません

何らかの理由により、element.find('li')は私に空の結果をもたらします。

navbar.js

<app-navbar ui-view="navbar"> 
    <div class="nb-main"> 
    <ul id="list-nav" class="list-navbar"> 
     <li ng-include="'svg/navbar-home.svg'" ui-sref="base.home"></li> 
     <li ng-include="'svg/navbar-discover.svg'" ui-sref="base.discover"></li> 
     <li ng-include="'svg/navbar-discover.svg'" ui-sref="base.discover"></li> 
    </ul> 
    <div class="nb-img line-navbar"></div> 
    </div> 
</app-navbar> 

_navbar.html

navbar.directive('appNavbar', [ function() { 
    return { 
    restrict: 'E', 
    link: function ($state, element) { 
     $state.$on("$stateChangeSuccess", function (event, toState) { 
     console.log(element.find('li')); // here is comming an empty value 
     angular.forEach(element.find('li'), function (a, i) { 
      // li css change stuff 
     }); 
     }); 
    } 
    }; 
}]); 

私が間違って何をやっている:ここで私は私のコードを貼り付け、以下の? the documentationから

+0

'link'メソッドの最初に' console.log(element) 'を実行できますか?最初は要素が基本的な 'DOMElement'なのではないかと思っていましたが、もっと多くのドキュメントを読んで(自分のコードを見て)、[jqLit​​e](https://docs.angularjs.org /api/ng/function/angular.element)あなたが望むものとまったく同じオブジェクトです。 – Sam

+0

次の応答を出力します: '[app-navbar.ng-scope] 0:app-navbar.ng-scope length:1 __proto__:Object [0]'。配列を通して 'childnodes'を見ると、' li.ng-scope'が見つかります。 – DevStarlight

+0

本当にこれをする必要はありません(私は最初に答えを投稿しましたが、ドキュメントは私に矛盾していることに気づきました)。 'element.find( 'li')'を 'angular.element(element).find( 'li')'に置き換えてみてください。 – Sam

答えて

1

注:この関数は、タグ名/ CSSセレクタによって要素を見つけることができませんことを覚えておいてください。タグ名による検索の場合は、代わりにangular.element(document).find(...)または$document.find()を入力するか、標準のDOM APIを使用してください(例: document.querySelectorAll()

+0

これは私が元々考えていたものです。 "Angularのすべての要素参照は、常にjQueryまたはjqLit​​e [...]でラップされています。これらの要素は決して生のDOM参照ではありません。 ([directive documentation](https://docs.angularjs.org/guide/directive#creating-a-directive-that-manipulates-thedom)でも、2番目のパラメータは "jqLit​​e-wrapped element"であると言われています。 ) – Sam

+0

私のブラウザのコンソールで 'angular.element(document).find( 'li')'を実行すると、私の要素が出力されますが、なんらかの理由で私の指示文では起こりません。私の 'ui-view'を読み込む際に何か問題があると思います。 – DevStarlight

+0

多くの時間を調査した結果、問題の原因を 'li'の' ng-include'と考えました。それを削除すると私の問題は解決しました。それはあなたが知っている正常な行動ですか?またはそれをバグとしてマークする必要がありますか?私は人々が 'ng-include'の代わりに' directives'を使うことを提案しています。 – DevStarlight

1

私は答えを見つけたので、私は何をしようとしているのか、どのように解決したのか説明しようとしています。基本的に2つの問題がありました。

$stateChangeSuccess$rootScopeng-includeという問題がありました。指令がプロセスを開始したとき、ng-includeはロードを完了していませんでした。

このように問題を解決するには、コンテンツが読み込まれるまで待つ必要があるので、$timeoutを考えてください。 <ng-include src="#"></ng-include>:要素の代わり<ANY ng-include="#"></ANY>

navbar.directive('appNavbar', [ '$timeout', function ($timeout) { 
    return { 
    restrict: 'E', 
    link: function ($state, element) { 
     $timeout(function() { 
     $state.$on("$stateChangeSuccess", function (event, toState) { 
      console.log(element.find('li')); // here is comming an empty value 
      angular.forEach(element.find('li'), function (a, i) { 
      // li css change stuff 
      }); 
     }); 
     }); 
    } 
    }; 
}]); 

第二つが属性としてng-includeを使用することが関連していました。 directiveには何も変更せずに、このコードは、問題を解決します

<div class="nb-main"> 
    <ul class="list-navbar"> 
    <li ui-sref="base.home"> 
     <ng-include src="'svg/navbar-home.svg'"></ng-include> 
    </li> 
    <li ui-sref="base.home"> 
     <ng-include src="'svg/navbar-interaction.svg'"></ng-include> 
    </li> 
    <li ui-sref="base.home"> 
     <ng-include src="'svg/navbar-discover.svg'"></ng-include> 
    </li>  
    </ul> 
    <div class="nb-img line-navbar"></div> 
</div> 

、私はまだそれが仕事やない可能属性と要素間のスワップ理由については考えているが、このコードは魔法のように動作します!

+1

まず、@DevStarlight、あなたは問題を解決できたことをうれしく思っています。第二に、あなた自身の答えを受け入れるように自由に感じてください。最後に、2つの問題点について1)。 ['$ apply'と' $ digest'](http://jimhoskins.com/2012/12/17/angularjs-and-apply.html)は '$ timeout'よりももっと洗練された解決策かもしれません。私は 'ng-include'が属性として機能すると確信しています。おそらく、おそらく' element.find() 'の原因となった要素をAngularに置き換えて誤った動作をさせるかもしれません。 – Sam

関連する問題