質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Electron

Electronは、HTML5とNode.jsというWebの技術を用いてデスクトップアプリケーションを作成できるクロスプラットフォームな実行環境です。

jQueryプラグイン

jQueryの拡張機能。 様々な種類があり、その数は膨大です。公開済みのプラグインの他にも、自作することもできます。 jQueryで利用できるようにしておくだけで、導入およびカスタマイズが比較的容易に行なえます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

1回答

4686閲覧

【jQuery/nestable】ツリーを作り直すと、expandボタンが表示されなくなる

nnahito

総合スコア2004

Electron

Electronは、HTML5とNode.jsというWebの技術を用いてデスクトップアプリケーションを作成できるクロスプラットフォームな実行環境です。

jQueryプラグイン

jQueryの拡張機能。 様々な種類があり、その数は膨大です。公開済みのプラグインの他にも、自作することもできます。 jQueryで利用できるようにしておくだけで、導入およびカスタマイズが比較的容易に行なえます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

1クリップ

投稿2017/01/07 13:22

質問

jQueryのNestableというプラグインを使い、ツリービューを作っているのですが、
そのツリーを動的に、JSONファイルを読み込んで再度作成し直すと、
Expandボタンが表示されなくなってしまいます。
以下の図にサンプルを提示します。

イメージ説明

上図は、1度目にJSONデータから作成したツリーの図です。
これは、ツリーノード上の「+」ボタンから、ノードを追加した場合でもExpandボタンは表示されます。

しかし、この状態で別のJSONファイルからツリーを作り直すと、下図のようにExpandボタンが消えてしまいます。

イメージ説明

この理由をずっと探しているのですが、なかなか見つけることができません。

以下に、JavaScriptのコードを記載します。
他、必要な情報がございましたらご指摘ください。

定義

この変数で、ツリーの個数やノードのIDを管理しています。

JavaScript

1var $treeJsonID = '[{"id":1}]';

この変数に、ノードの中身を格納しています(質問には関係ないかと思われます。)

JavaScript

1var $treeData = { 2 "1":{ 3 "title": "New Node", 4 "contents": "" 5 } 6 };

ツリーの表示エリアです

html

1<!-- ノード --> 2<div class="dd" id="TreeNode"> 3 <ol class="dd-list"></ol> 4</div>

ツリーを作成する関数

この関数に、定義した$treeJsonIDを渡します。

よろしくお願いいたします。

JavaScript

1/* JSONからTreeを作成 */ 2 function createTreeNode(json){ 3 var obj = json; 4 var output = ''; 5 6 function buildItem(item) { 7 var html = ''; 8 html += "<li class='dd-item dd3-item' data-id='" + item.id + "' id='tree-"+ item.id +"'>"; 9 html += "<div class='dd-handle dd3-handle'></div>"; 10 html += '<div class="dd3-content"><a href="javascript:setEditData('+ item.id +');" id="tree-node-name-'+ item.id +'">' + $treeData[item.id]["title"] + '</a>'; 11 html += '<div class="right treatpanel">'; 12 html += '<a href="javascript:addTreeNode('+ item.id +');"><i class="tiny material-icons">add</i></a>'; 13 html += '<a href="javascript:deleteTreeNode('+ item.id +');"><i class="tiny material-icons">delete</i></a>'; 14 html += '<a href="#" onclick="$(\'#newNodeName\').val(\''+ $treeData[item.id]["title"] +'\');$(\'#newNodeNamesID\').val(\''+ item.id +'\');" data-target="editNodeNameModal"><i class="tiny material-icons">mode_edit</i></a>'; 15 html += '</div></div>'; 16 17 18 if (item.children) { 19 html += "<ol class='dd-list'>"; 20 $.each(item.children, function (index, sub) { 21 html += buildItem(sub); 22 }); 23 html += "</ol>"; 24 } 25 26 html += "</li>\n"; 27 return html; 28 } 29 30 $.each(JSON.parse(obj), function (index, item) { 31 output += buildItem(item); 32 }); 33 34 35 $('.dd-list').html(output); 36 37 $('#TreeNode').nestable(); 38 $('#TreeNode').trigger('create') 39 40 }

最初の起動

jQueryのdocument readyです。

JavaScript

1$(document).ready(function(){ 2 // 最初のデータを作成 3 createTreeNode($treeJsonID); 4 5});

データの作り直し

ボタンが押されたら、以下のように作り直そうと考えています。
なお、検証しましたが、ファイルのJSONに誤りはありませんでした。

JavaScript

1$.getJSON('ファイルパス', function(json){ 2 $treeJsonID = JSON.stringify( json["treeid"][0] ); 3 $treeData = json["treedata"][0]; 4 5 6 $('.dd-list').empty(); 7 $('#TreeNode').nestable('destroy'); 8 9 createTreeNode($treeJsonID); 10});

一応

読み込み先のJSONデータです。

JSON

1{ "treeid": [[{"id":1},{"id":2},{"id":3,"children":[{"id":4},{"id":5}]}]], "treedata": [{"1":{"title":"test1","contents":"001\naaa\nちゃんと出力されてますか?"},"2":{"title":"test2","contents":"002"},"3":{"title":"test3","contents":"003"},"4":{"title":"test4","contents":"004"},"5":{"title":"test5","contents":"005"}}] }

参考

バージョン情報

Electron 1.4.12
jQuery 3.1.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Jquery forum の lschult32 さんのコメントが参考になると思います(そこのページの下から6番目)

投稿2017/01/07 20:34

編集2017/01/07 20:37
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nnahito

2017/01/08 10:44

ご回答ありがとうございます。 こちらの意味ですが、 「<div class="dd" id="TreeNode">」を「<div>」で囲めばいい……という解釈になるのでしょうか? また、色々実験してみたところ、ツリーの情報がドラッグ・アンド・ドロップなどで更新された親ノードにExpandボタンがつくことが確認できました。 全体的に更新イベントを発火させる方法などは有るのでしょうか?
退会済みユーザー

退会済みユーザー

2017/01/08 13:33 編集

そうみたいですね Nestableで使用している領域のClassのCSSリセット <div id="NES"> <div class="dd" id="TreeNode"> <ol class="dd-list"></ol> </div> </div> id="NES"(適当)で丸ごと囲んで $("#NES").html('<div class="dd" id="TreeNode"><ol class="dd-list"></ol></div>'); を実施し更新したら表示されましたね --------------------------------------- 結構色々試している人はいるけど 全体的に更新するイベントは無さそうですね メンドクサイ serializeイベントはid部しか表示されないので テキスト部は自作するしかないのかな?メンドクサイです
nnahito

2017/01/08 13:51

ご回答ありがとうございます!!! うおおおおおお!表示されました!!ありがとうございます!! しかし、こうしないといけないというのはかなり面倒くさいですね…… 使わせていただいていて何ですけど、面倒ですね^^; 前回に引き続き解決まで導いてくださり、ありがとうございました! まだまだ、初心者エンジニアですが、精一杯勉強させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問