Область видимости переменных Dojo Javascript

Я использую dgrid и пытаюсь настроить хранилище данных извне. Когда страница загружается, я вызываю aliasTicket.load() для создания сетки. Во время загрузки сетки datasource равно нулю. Когда запрос выполняется, устанавливается setAliasSource(aliasData);.

Ошибок нет, однако сетка по-прежнему пуста. aliasStore обновляется данными, однако они не отражаются в сетке даже после обновления сетки. Как я могу получить данные, отраженные в сетке после запроса?

Объект JavaScript

   var aliasTicket = (function (){

    var aliasData = [];

    require([ "dojo/store/Observable", "dojo/store/Memory"]);   
    var aliasStore = new dojo.store.Observable(new dojo.store.Memory({
        data: aliasData,
        idProperty: "id"
      }));  

    return{         

        load:function(){

            require([
                     ........

                   ], function(declare, Memory, OnDemandGrid, ColumnSet, Selection,
                     selector, Keyboard, DijitRegistry, editor, ColumnHider,
                     registry, Observable,lang) {

                aliasData = this.aliasData;

                var Store = this.aliasStore = new dojo.store.Observable(new dojo.store.Memory({
                    data: aliasData,
                    idProperty: "id"
                  }));

                console.log(Store);

                var CustomAliasNameGrid = declare([OnDemandGrid, selector, Selection, Keyboard, editor, DijitRegistry, ColumnHider]);

                  var aliasNameGrid = new CustomAliasNameGrid({
                    store: Store,
                    columns: {
                      id: {
                        label: "Id",
                        field: "id",
                        hidden: true,
                        autoSizeColumn: true
                      },

                      employeeTicketId: {
                        label: "Employee Ticket Id",
                        field: "employeeTicketId",
                        hidden: true,
                        autoSizeColumn: true
                      },

                      chkBox: selector({}),


                      aliasName: {
                        label: "Alias Names",
                        field: "aliasTicketName",
                        autoSizeColumn: true,
                        formatter: function(str) {
                          return str.replace(/\w\S*/g, function(txt) {
                            return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
                          });
                        }
                      }

                    },
                    selectionMode: "none",
                    loadingMessage: "Loading data...",
                    noDataMessage: "No results found....",
                    allowSelectAll: true
                  }, "aliasNameGrid");  



                aliasNameGrid.refresh()

            }); 

        },

        setAliasSource: function (data){
            console.log(data);
            this.aliasSource = data;            

        },

        setAliasData: function (data){
            this.aliasData = data;              
        },

        getAliasSource: function (){

            return this.aliasSource;
        }       

    };  

})();

Настройка данных хранилища данных

aliasData = [{.....},
             {.....},
             {......];          


            require(["dijit/dijit"]);
            aliasTicket.setAliasSource(aliasData);              
            dijit.byId('aliasNameGrid').refresh();

person devdar    schedule 25.10.2014    source источник


Ответы (1)


Вы устанавливаете «this.Store» в массив объектов, а не в настоящий объект «магазин додзё». Следуя вашему коду, я не вижу, где вы на самом деле используете this.Store. Внутри кода сетки я вижу локальную переменную с именем «Магазин».

Поэтому я не уверен, что следую вашему примеру кода здесь, но вы должны «установить» хранилище сетки, а затем обновить его. Что-то вроде этого.

 setAliasSource: function (data){
        console.log(data);
        this.Store = data;
        dijit.byId('aliasNameGrid').set("store",new dojo.store.Observable(new dojo.store.Memory({ data: data,idProperty: "id"}));
        dijit.byId('aliasNameGrid').refresh();

    },
person Ferry Kranenburg    schedule 26.10.2014
comment
Я объявил store в функции загрузки var Store = this.aliasStore = new dojo.store.Observable(new dojo.store.Memory({ data: aliasData, idProperty: id })); - person devdar; 27.10.2014
comment
Я думаю, что, поскольку загрузка была запущена первой, ее нужно запустить снова, чтобы данные были отражены, однако повторная загрузка может быть не очень хорошей идеей, поскольку виджет уже зарегистрирован. - person devdar; 27.10.2014
comment
Нет необходимости вызывать обновление после вызова set('store', ...) - это уже будет обновляться для вас. - person Ken Franqueiro; 27.10.2014