Вернуть дополнительные данные помимо дерева данных из ExtJS TreeLoader dataUrl? - PullRequest
1 голос
/ 05 июня 2010

Я задавал этот вопрос на форумах Ext JS, но не получил ответов, поэтому я спрашиваю здесь.

У меня есть TreePanel (код ниже), который использует TreeLoader и AsyncTreeNode. В моем методе API, указанном в dataUrl TreeLoader, я возвращаю массив JSON для заполнения дерева.

Это прекрасно работает, конечно. Однако мне нужно вернуть дополнительный элемент - целое число - в дополнение к массиву, и мне нужно отобразить это значение где-то еще в моем пользовательском интерфейсе. Это возможно? Если нет, то что еще было бы хорошим решением?

Вот код, который у меня сейчас есть:

tree = new Ext.tree.TreePanel({
  enableDD: true,
  rootVisible: false,
  useArrows: true,

  loader: new Ext.tree.TreeLoader({
    dataUrl: '/api/method'
  }),

  root: new Ext.tree.AsyncTreeNode()
});

Я хочу вернуть одно целочисленное значение для всего ответа, а не для каждого узла. В основном мой метод API создаст запись базы данных, и мне нужно вернуть значение из этой записи базы данных.

РЕДАКТИРОВАТЬ Благодаря Майку, я решил эту проблему. Я расширил класс Ext.tree.TreeLoader следующим образом:

TreeLoaderWithMetaData = Ext.extend(Ext.tree.TreeLoader, {
  processResponse : function(response, node, callback) {
    var json = response.responseText;

    try {
      var o = eval("("+json+")");
      metaData = o.shift();

      node.beginUpdate();

      for(var i=0, len=o.length; i<len; i++) {
        var n = this.createNode(o[i]);

        if (n) {
          node.appendChild(n);
        }
      }

      node.endUpdate();

      if(typeof callback == "function") {
        callback(this, node);
      }
    }
    catch (e) {
      this.handleFailure(response);
    }
  }
});

И тогда я могу ссылаться на переменные в метаданных, например на открытые члены: metaData.my_variable1, metaData.my_variable2. Мои данные AJAX с сервера просто содержат дополнительный элемент массива:

[{"my_variable1":"value1","my_variable2":"value2"},{"id":"node1","text":"Node 1",children:[{"id":"node1nodeA","text":"Node 1 Node A"}]]

Ответы [ 2 ]

3 голосов
/ 06 июня 2010

Вам нужно переопределить функцию processResponse в TreePanel, и тогда вы сможете вернуть любой формат JSON, который вам нужен:

Из форумов ExtJS: http://www.extjs.com/forum/showthread.php?32772-Passing-JSON-string-from-Grails-to-populate-TreePanel

Код внизу этой ветки поможет вам.

0 голосов
/ 06 июня 2010

Насколько я понял, вы хотите передать дополнительные параметры с помощью json и отобразить их где-нибудь еще, когда дерево загружено.

В этом случае вы можете просто вернуть с сервера модифицированный JSON, как это

[{ id: 1, yourParmam: 'val', текст: «Узел листьев», лист: правда }, { id: 2, yourParmam: 'val', текст: «Узел папки», дети: [{ id: 3, yourParmam: 'val', текст: «Детский узел», лист: правда }] }]

Затем подпишитесь на даже load: (Object This, Object node, Object response) и просто проанализируйте ответ, чтобы узнать, что вы parm и делаете все, что вам нужно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...