1

私は Dojo (1.7) に非常に慣れていないので、AMD ローダーとグローバルな哲学に非常に興奮しています。その後、数十のドキュメントを読み終えたと思って、何度もグーグルで検索しましたが、頭がおかしくなり始めました。まだ理解できていません。いくつかのことを実行します:任意の種類の JSONの dijit.Tree を表示したいと思います。はい、JSON エディターのようです。ここに私の期待があります:

  • サンプル JSON :{"infos":{"address":"my address","phone":"my phone"},"insurance":{"forks":[14,53,123],"prices":[5,8,"3%"]}}
  • 任意の JSON のさまざまな変数を表示します。ルートの子はルートの json 変数、子の L1 はルート変数などです。json 変数の型 (文字列、数値、オブジェクト、配列) に応じて、対応するアイコンも表示します。
  • json全体を解析して一度にフォーマットする必要はありません。たとえば、最初にルートノードを表示し、次に適切にフォーマットされた子がgetChildrenメソッドを実行するなど、expandoで段階的に行われます(遅延のように)ロード)。私はすでに javascript を使用して独自の Trees クラスを作成しています。より柔軟な方法は、コンストラクターに dataRoot、renderItem(dataItem, domItem)、および getChildren(dataItem) を指定して、ツリーのみを実行して返すことができるようにすることでした。必要な場合にのみレンダリングを実行し、ツリーはデータ構造について知らず、それを変更することもありませんでしたが、なぜ dijit.Tree が非常に制限的な構築方法を必要とするのかよくわかりません...

これが私の最後の試みです、それは完全に正しい方法ではないかもしれません(おそらくサブクラス化する必要があります)が、私が理解している限り、3つのクラス(道場ストア、ツリーモデル、ツリーウィジェット)で遊ぶ必要がありますが、最初はモデルはルート ノードを取得できません。別のコード コメントを確認してください。それで、いくつかの明確な説明を含む簡単な例を私に与えることができる忍耐強い人がいますか(ええ、私は少し要求が厳しいです)、少なくともコンストラクターのオプションに必要な正しい変数のリストは、私の素敵なツリービューの表示を開始するために必要ですjson ファイルがたくさんあり、完全に迷ってしまいました。どうもありがとうございました。

...
// before there is the AMD part that load the needed things
Xhr.get({ url:'data/file.json', handleAs:'json',
    load: function(data){
        console.log('xhr.loaded : ', data);// got my javascript object from the json string
        var store = new ItemFileReadStore({// is it the right store I need ??
            // or the Memory store ?
            // assuming later I'll need to save the data changes 
            rootId : 'root',// 
            rootLabel : 'Archive',// useless ? isn't it the model responsability ?
            data : {id:'root', items:[data]}// trying to give a root node well formatted
        });
        var model = new TreeStoreModel({
            store : store,
            getChildren : function(obj){
                // firstly here it seems the root is not found
                // I got a 'error loading root' error
                // what is missing in my instanciations ??
                // what is exactyly the type of the 1st arg : a store ?
                console.log('getChildren : ', this.get(obj.id));
            },
            mayHaveChildren : function(){
                console.log('mayHaveChildren ', arguments);
                return true;
            }
        });
        var tree = new Tree({
            model: model
        }, domId);
        tree.startup();
    }
});
4

2 に答える 2

5

私のソリューションは、ストアをツリーに接続することdojo/store/Memoryに触発されたものに基づいています。

ここに画像の説明を入力してください

ライブデモはhttp://egoworx.com/で見つけるか、 dropboxから完全なソースをダウンロードできます。

今コード。最初dojo/store/Memory

var data =  {"infos":{"address":"my address","phone":"my phone", "gift": false, "now": new Date()},"insurance":{"forks":[14,53,123],"prices":[5,8,"3%"]}};

var store = new Memory({

  data: data,

  mayHaveChildren: function(object) {
    var type = this.getType(object);
    return (type == "Object" || type == "Array");
  },

  getChildren: function(object, onComplete, onError) {
    var item = this.getData(object);
    var type = this.getType(object);
    var children = [];

    switch(type) {
      case "Array":
        children = item;
        break;
      case "Object":
        for (i in item) {
          children.push({label: i, data: item[i]});
        }
        break;
    }
    onComplete(children);
  },

  getRoot: function(onItem, onError) {
    onItem(this.data);
  },

  getLabel: function(object) {
    var label = object.label || object + "";
    var type = this.getType(object);

    switch(type) {
      case "Number":
      case "String":
      case "Boolean":
      case "Date":
        var data = this.getData(object);
        if (data != label) {
          label += ": " + this.getData(object);
        }
    }

    return label;
  },

  getData: function(object) {
    if (object && (object.data || object.data === false) && object.label) {
      return object.data;
    }
    return object;
  },

  getType: function(object) {
    var item = this.getData(object);
    if (lang.isObject(item)) {
      if (lang.isArray(item)) return "Array";
      if (lang.isFunction(item)) return "Function";
      if (item instanceof Date) return "Date";
      return "Object";
    }

    if (lang.isString(item)) return "String";
    if (item === true || item === false) return "Boolean";
    return "Number";
  },

  getIconClass: function(object, opened) {
    return this.getType(object);
  }    
});

データにブール値日付型を追加したことに注意してください。

dijit/Treeこのストアに基づく:

var tree = new Tree({
    model: store,
    persist: false,
    showRoot: false,
    getIconClass: function(object, opened) {
      if (lang.isFunction(this.model.getIconClass)) {
        return this.model.getIconClass(object, opened);
      }
      return (!item || this.model.mayHaveChildren(item)) ? (opened ? "dijitFolderOpened" : "dijitFolderClosed") : "dijitLeaf";
    }
  }, "placeholder");

tree.startup();

そして最後に、データ型アイコンを表示するためのスタイルシート:

.dijitTreeIcon {
  width: 16px;
  height: 16px;  
}

.Object {
  background-image: url(http://dojotoolkit.org/api/css/icons/16x16/object.png);
}

.Array {
  background-image: url(http://dojotoolkit.org/api/css/icons/16x16/array.png);
}

.Date {
  background-image: url(http://dojotoolkit.org/api/css/icons/16x16/date.png);
}

.Boolean {
  background-image: url(http://dojotoolkit.org/api/css/icons/16x16/boolean.png);
}

.String {
  background-image: url(http://dojotoolkit.org/api/css/icons/16x16/string.png);
}

.Number {
  background-image: url(http://dojotoolkit.org/api/css/icons/16x16/number.png);
}

現在中国にいるのでjsFiddleにアクセスできませんが、ヨーロッパに戻ったらその上にコードを置いて、ここにリンクを投稿します。

于 2012-06-19T06:51:14.067 に答える
1

代わりにそのような何かを試してください:

store = new dojo.data.ItemFileWriteStore({
                url : "",
                data: {
                    identifier: "id",
                    label   : "label",
                    items   : [{
                        id      : "root",
                        label   : "root",
                        type    : "root",
                        children: [data]
                    }]
                }
            });

また、一般的に、ツリー関数をオーバーライドすることは避けてください。それらを拡張することもできますが、注意が必要です。console.logが必要な場合は、むしろそれらに接続してください...

ItemFileReadStoreは読み取り専用ストアであるため、「変更の保存」に必要なストアではありません。ItemFileWriteStore、JsonRestなどを試すことができます。

于 2012-06-13T08:00:05.877 に答える