2013-02-19 3 views
0

Я пытаюсь нарисовать сетку, где каждая строка - производительность запаса за один день. В моих структурах данных у меня есть Date, a Stock и ресурс Stock Price. Магазин, прикрепленный к моей сетке, - это магазин Stock Price.Как показать значение из ассоциации модели в сетке ExtJS?

Так что, насколько мне известно, моя самая большая проблема заключается в том, что когда рендеринг ячеек сетки, мне нужно уже иметь значение, или мне нужно иметь функцию блокировки до получить значение.

Когда я использую магическую функцию getStore(), мне говорят, что запись не знает об этом (неопределенный метод). Я предполагаю, что это потому, что запись не имеет той же функциональности, что и автономная модель.

Я вижу несколько путей выхода из этого:

  1. Настройки сетки и/или магазина, так что, когда нагрузка происходит, все связанные строки загружаются одновременно.
  2. Создайте обратный вызов в рендерере и измените значение ячейки после этого, но я точно не знаю, как это сделать. Я действительно не хочу менять значение ячейки (StockId), только видимый вывод (Symbol).
  3. Измените свой API, чтобы он соответствовал моему представлению.

Подведение итогов: # 1 кажется большой работой для кажущегося простого результата. Я продолжаю пытаться использовать ассоциации, но я считаю, что они не очень полезны ни для чего, кроме мелочей здесь и там, и, конечно, не для большого количества данных. # 2 Я не совсем знаю, с чего начать в данный момент; и # 3 кажется массивным излишеством и, как правило, разрушает мою серверную сторону, поскольку я имею в виду еще несколько объединений и большую сложность при сохранении записей.

Таким образом, две части вопроса:

  1. Кто-нибудь знает, как загрузить значение из соответствующей модели в сетке?
  2. Если нет, чтобы выразить свое любопытство, какие вещи используются для ассоциаций в любом случае, когда на экране есть множество данных? Похоже, что данные Лот являются причиной использования Ext vs jQueryUI или некоторых других интерфейсов пользовательского интерфейса, поэтому мне интересно, для чего нужны ассоциации.

Модель - Stock Price

Ext.define('MyApp.model.StockPrice', { 
    extend : 'Ext.data.Model', 
    idProperty : 'StockPriceId', 
    fields : [ { 
     name : 'StockId', 
     type : 'int' 
    }, { 
     name : 'Open', 
     type : 'float' 
    }, { 
     name : 'Close', 
     type : 'float' 
    }, { 
     name : 'DateId', 
     type : 'date' 
    }], 
    proxy : { 
     type : 'rest', 
     url : '/api/stock.price' 
    }, 
    reader : { 
     type : 'json' 
    }, 
    associations : [ { 
      type : 'hasOne', 
      model : 'MyApp.model.Date', 
      primaryKey : 'DateId', 
      foreignKey: 'DateId' 
    },{ 
     type : 'hasOne', 
     model : 'MyApp.model.Stock', 
     primaryKey : 'StockId', 
     foreignKey : 'StockId' 
    } ] 
}); 

Модель - Векторная

Ext.define('MyApp.model.Stock', { 
    extend : 'Ext.data.Model', 
    idProperty : 'StockId', 
    fields : [ { 
     name : 'StockId', 
     type : 'int' 
    }, { 
     name : 'Symbol', 
     type : 'string' 
    } ], 
    proxy : { 
     type : 'rest', 
     url : '/api/stock' 
    }, 
    reader : { 
     type : 'json' 
    }, 
    associations : [ { 
     type : 'hasMany', 
     model : 'MyApp.model.StockPick', 
     primaryKey : 'StockId', 
     foreignKey : 'StockId' 
    }] 
}); 

Модель - Дата

Ext.define('MyApp.model.Date', { 
    extend : 'Ext.data.Model', 
    fields : [ 'DateId', 'Date' ] 
}); 

Магазин - Склад Цена

Ext.define('MyApp.store.StockPrice', { 
    extend : 'Ext.data.Store', 
    model : 'MyApp.model.StockPrice', 
    remoteSort : true, 
    remoteFilter : true, 
    pageSize : 5, 
    autoLoad : true 
}); 

View - Stock Price

Ext.define('MyApp.panel.StockData', { 
    extend : 'Ext.grid.Panel', 
    store : 'MyApp.store.StockPrice', 
    columns : [ 
      { 
       text : 'Symbol', 
       flex : 1, 
       sortable : false, 
       hideable : false, 
       dataIndex : 'StockId', 
       renderer : function(stockId, metadata, stockPriceRecord) { 
        // What goes in here? PROBLEM POINT 
        MyApp.model.Stock.load(stockId, function() { 
         // ... some callback 
        }); 
        // OR 
        return stockPriceRecord.getStock().get('Symbol'); 
       } 
      }, 
      { 
       text : 'Open', 
       flex : 1, 
       dataIndex : 'Open', 
       renderer : 'usMoney' 
      }, 
      { 
       text : 'Close', 
       flex : 1, 
       dataIndex : 'Close', 
       renderer : 'usMoney' 
      }, 
      { 
       text : 'Volume', 
       flex : 1, 
       dataIndex : 'Volume' 
      }] 
}); 

ответ

4

Ваш единственный реальный вариант для отображения данных из соответствующей модели в сетке, чтобы использовать пользовательскую функцию рендеринга на колонка. Это не изменит никаких значений; он просто отобразит желаемый результат в ячейке.

Теперь, что касается реализации этой функции рендеринга: я бы начал с удаления прокси из моделей и вместо этого создавал магазины для каждой модели и позволял магазинам управлять прокси-серверами - затем присоединить хранилище для Stock в качестве слушателя в магазине за StockPrice, чтобы прослушать событие datachanged. Когда данные магазина StockPrice меняются, вы должны захватить каждый уникальный ссылочный идентификатор Stock, а затем сообщить в магазин Stock, чтобы запросить полезную нагрузку на акции с этими идентификаторами.

Это может означать изменение вашего API немного для поддержки SQL IN(...) за кулисами, но, оставив соединения на стороне клиента, вы будете уделять меньше внимания своей стороне сервера.

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

+0

Принял у меня много настраиваемого кода, но я его получил. Я обнаружил, что мне пришлось вызвать «render» после того, как хранилище «Stock» загрузилось, чтобы затем перерисовать символы, но он работает. Благодаря! – Drew

+2

Пользовательский код действительно, угадайте, поэтому его просто называют «каркасом»! Надеюсь, Sencha продолжит делать такую ​​прекрасную работу по продвижению ExtJS и сделает ассоциации более надежными. – tuespetre

Смежные вопросы