2016-05-05 4 views
0

knockoutjs foreachバインディングで動的に生成されるコード内にmaterializecss javascriptドロップダウン(http://materializecss.com/dropdown.html)を使用しようとすると、ドロップダウンオプションがクリックされても表示されません。knockoutjsとmaterializecss javascriptドロップダウン

<ul class="list" data-bind="foreach: items"> 
    <li> 
    <!-- Dropdown Trigger --> 
    <a class='dropdown-button btn' href='#' 
      data-bind="attr: {'data-activates': 'dropdown' + $index()}">Drop Me!</a> 
    <!-- Dropdown Structure --> 
    <ul data-bind="attr: {id: 'dropdown' + $index()}" class='dropdown-content'> 
     <li><a href="#!">one</a></li> 
     <li><a href="#!">two</a></li> 
     <li><a href="#!">three</a></li> 
    </ul> 
    </li> 
</ul> 

Materializecssは、ドロップダウンがしかし

$(".dropdown-button").dropdown(); 

で初期化されなければならないと言い、これは効果がないようです。

ご協力いただければ幸いです。私はknockoutjsフォーラムや他の場所でヘルプを見つけることができませんでした。

EDIT - 完全な作業モデル

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8" /> 
    <title></title> 
    <!--Import Google Icon Font--> 
    <link href="http://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"> 
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.97.6/css/materialize.min.css"> 
</head> 
<body> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.97.6/js/materialize.min.js"></script> 

    <script > 
     function ItemsViewModel() { 
      var that = this; 

      function collectionItem(root, title) { 
       var self = this; 
       self.title = ko.observable(title); 
      }; 

      that.items = ko.observableArray(); 
      that.loadItems = function() { 
       for (var i = 0, j = 5; i < j; i++) { 
        that.items.push(new collectionItem(that,"title"+ i.toString())); 
       } 
      }; 
     }; 

     ko.bindingHandlers.materializeDropdown = { 
      init: function (element, valueAccessor) { 
       $(element).dropdown(); 
      }, 
      update: function (element, valueAccessor, allBindings) { 
      } 
     }; 

     var itemsViewModel; 

     $(document).ready(function() { 
      itemsViewModel = new ItemsViewModel(); 

      ko.applyBindings(itemsViewModel,  $("#divForItemsViewModel").get(0)); 
      itemsViewModel.loadItems(); 
     }); 
    </script> 
    <div id="divForItemsViewModel"> 
     <ul class="list" data-bind="foreach: items"> 
      <li> 
       <div data-bind="text:title"></div> 
       <!-- Dropdown Trigger --> 
       <a class='dropdown-button btn' href='#' 
        data-bind="attr: {'data-activates': 'dropdown' + $index()}, materializeDropdown">Drop Me!</a> 
       <!-- Dropdown Structure --> 
       <ul data-bind="attr: {id: 'dropdown' + $index()}" class='dropdown-content'> 
        <li><a href="#!">one</a></li> 
        <li><a href="#!">two</a></li> 
        <li><a href="#!">three</a></li> 
       </ul> 
      </li> 
     </ul> 
     <a class='dropdown-button btn' href='#' 
     data-activates="dropdownx">Drop Me THIS WORKS</a> 
     <ul id="dropdownx" class='dropdown-content'> 
      <li><a href="#!">one</a></li> 
      <li><a href="#!">two</a></li> 
      <li><a href="#!">three</a></li> 
     </ul> 
    </div> 
</body> 
</html> 
+0

あなたの*質問*は技術的には偽薬ではありませんが、私はほぼ逐語的に繰り返すでしょう[これは私がしばらく前に書いた](http://stackoverflow.com/a/34394679/419956)。 – Jeroen

+0

ありがとうございました。はい、この質問を投稿する前に私はあなたの答えを研究し、私はちょうどフェデのカスタムバインディングを試みたが、それは助けに見えなかった。トリガーをコンテンツにリンクするための鍵は、トリガでのデータバインディングとターゲット上のIDバインディングです。値は同じでなければなりません。私はそれらを正しく設定していると思います。 –

+0

このUIプラグインを統合するためのカスタムバインドを使用することは必須であるに過ぎません。あなたがそうするように初期化することは、私が実際には決して働かないと思う限りです。どちらの場合でも(カスタムバインディングの有無にかかわらず)、質問のコードを[mcve]に拡張すると便利です。 – Jeroen

答えて

1

私はあなたがここで必要なのcustom bindingだと思います。私が考えていることは、$(".dropdown-button").dropdown();が呼び出されたときに、foreachバインディングが実行されていない可能性があり、したがってドロップダウンの値がまだ利用できないということです。

ドロップダウントリガーのaタグの前に、ドロップダウン構造のulを移動して、構造内のバインディングがトリガー内のバインディングより先に実行されるようにします。その後、カスタムバインディングをトリガーに追加します。トリガーは、呼び出されるとターゲット上で.dropdown()を実行します。ここで

EDIT

が示唆カスタムバインディングのサンプルです:

ko.bindingHandlers.materializeDropdown = { 
    init: function(element, valueAccessor) { 
     $(element).dropdown(); 
    }, 
    update: function(element, valueAccessor, allBindings) { 
    } 
}; 

そして、次のようにHTMLがある可能性があります。

<ul class="list" data-bind="foreach: items"> 
    <li> 
    <!-- Dropdown Structure --> 
    <ul data-bind="attr: {id: 'dropdown' + $index()}" class='dropdown-content'> 
     <li><a href="#!">one</a></li> 
     <li><a href="#!">two</a></li> 
     <li><a href="#!">three</a></li> 
    </ul> 
    <!-- Dropdown Trigger --> 
    <a class='dropdown-button btn' href='#' 
      data-bind="attr: {'data-activates': 'dropdown' + $index()}, materializeDropdown">Drop Me!</a> 
    </li> 
</ul> 

希望します。

+0

Thanks Fede - ちょうど$( "ドロップダウンボタン")を実行していることを指摘してください。私は実際にカスタムバインディングの必要性を見ないので、ドロップダウンをトリガするメソッドではなく、初期化のステップです。代わりに、テストとして、ページがレンダリングされた後、$( "。ドロップダウンボタン")を実行するリンクをクリックします。ドロップダウンを初期化するしかし、これは影響がないようです。おそらく、私はカスタムバインディングの使用を誤解しています。 –

+0

サンプルを使って私の回答を編集しますが、バインディングの後に手動で '$("。ドロップダウンボタン ")。dropdown();'を実行している場合は、アイデアがありません。とにかく完全性のために私の答えを更新します。 – Fede

+0

サンプルコードを含めるのに苦労してくれたFedeに感謝します。悲しいことに、カスタムバインディングを使用しても何の違いもありませんでした。 –

関連する問題