Не распознан tpl метаданных Ext JS 4.2

#json #extjs

#json #extjs

Вопрос:

Первый раз, долгое время… Я использую Ext JS 4.2.2.1144, у меня есть сетка, и мой запрос с сервера (php) возвращает метаданные в форме json, которые были ранее сгенерированы, когда пользователь решает изменить конфигурацию и размер столбцов, а затем сохранить эту информацию. Все поля, такие как width, dataIndex, align и все остальные, прекрасно перенастраивают сетку при использовании функции metaChanged. Проблема, с которой я сталкиваюсь, заключается в том, что одному из столбцов необходимо отправить информацию для tpl, которая на самом деле является местоположением отображаемого изображения. Мой Json выглядит следующим образом

 {
    "totalCount":"2",
        "root":"items",
        "metaData":
            {
                "fields":[
                    {"name":"queryid"},
                    {"name":"createUser"},
                    {"name":"subject"},
                    {"name":"priorityImage"}            
                ],
                "columns":[
                    {
                        "dataIndex":"queryid",
                        "width":100,
                        "text":"Queryid"
                    },
                    {
                        "dataIndex":"createUser",
                        "width":100,
                        "text":"Owner",
                        "align":"center"
                    },
                    {
                        "dataIndex":"subject",
                        "width":200,
                        "text":"Subject",
                        "hidden":true
                    },
                    {
                        "dataIndex":"priorityImage",
                        "width":70,"text":"Priority",
                        "hidden":true,
                        "align":"center",
                        "xtype":"templatecolumn",
                        "tpl":['<img src="_images/{priorityImage}" height="20px" width="20px" />']
                    }
                ]
            },
            "items":[
                {
                    "queryid":"1",
                    "createUser":"1",
                    "subject":"Here is a new project",
                    "priorityImage":"orange.png"
                },
                {
                    "queryid":"1",
                    "createUser":"1",
                    "subject":"SAL Form 4",
                    "priorityImage":"roundlightPurple.png"
                }
            ]
}
  

Я пробовал всевозможные способы отправки tpl для этого последнего столбца, но ни один из них не увенчался успехом. У кого-нибудь есть какие-либо подсказки о том, как это сделать? В результате получается текст, а не собственно изображение. Если я загружаю сетку непосредственно из хранилища, используя модель по умолчанию, я получаю изображение из tpl, но только не при выполнении этого через метаданные. Я пробовал одинарные кавычки, двойные кавычки, без фигурных скобок, с фигурными скобками, лол. У меня закончились идеи, чтобы попробовать. Надеюсь, я выражаюсь достаточно ясно. В любом случае, заранее спасибо за любую помощь, это действительно сводит меня с ума,
спасибо,
C5

Ответ №1:

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

Хотя это и не ответ «сделай это», я надеюсь, что это поможет.

Ответ №2:

Я решил обойти это, хотя, возможно, это не самое идеальное решение, но оно работает. При отправке tpl на сервер он фактически переводится из <img src="_images/{priorityImage}" height="20px" width="20px" /> в amp;#60;img src=amp;#34;_images/{priorityImage}amp;#34; height=amp;#34;20amp;#34; width=amp;#34;20amp;#34; />

Итак, вот мое исправление на данный момент в любом случае: прежде чем я вызову код для загрузки хранилища

 Ext.getCmp('lblCurrentMetaGrid').setText('projectsGridGrid');
store.on('metachange', metaChanged, this);
  

Тогда в функции metaChanged это выглядит следующим образом:

     function metaChanged(store,meta){
        var gridname = Ext.getCmp('lblCurrentMetaGrid').text;
        var grid = Ext.getCmp(gridname);
        for(var c = 0; c < meta.columns.length; c   ){
            var column = meta.columns[c];
            var tpl = column.tpl;
            if ( tpl !== undefined){
                meta.columns[c].tpl[0] = meta.columns[c].tpl[0].replace('amp;#60;','<');
                meta.columns[c].tpl[0] = meta.columns[c].tpl[0].replace('amp;#62;','>');
                meta.columns[c].tpl[0] = meta.columns[c].tpl[0].replace(/amp;#34;/g,'"');
            }
        }
        //lets look at all the metadata
        grid.reconfigure(store,meta.columns);
    }
  

Теперь я получаю свое изображение в сетке.