2015-06-03 4 views
0

Мы используем dojo JsonRest. Всякий раз, когда нам нужно обновлять сетку новыми данными, dojo запускает два вызова сервера.Почему Dojo grid.refresh делает другой вызов сервера?

Ниже приведен код.

var MyJsonRest = declare(JsonRest, { 
    get: function(id, options) { 
     return this.inherited(
      arguments, 
      [id, lang.mixin(this.headers, options)]); 
    } 
}); 

myDataStore = MyJsonRest({ 
    target: someurl, 
    headers: { 
     'moduleUName': somemodulename 
    }, 
    idAttribute: "id", 
     query: function(query, options) { 
      // some other code      
     }     

}); 

myDataStore.get("", { paramName: paramValue }).then(function(result) { // this fires a request to server 
    gridObj.refresh(); // this fires same request 2nd time to the server 
    // if the gridObj.refresh() is commented out, then the grid does not displayes the new data. 
}); 

ответ

0

Для того, чтобы Сетки для обнаружения изменений в магазине, не вызывая обновления, вы должны обернуть JsonRest магазин с dojo.store.Observable. Любые обновления в магазине будут автоматически обновляться в сетке.

myCacheDataStore = new Cache(myDataStore, new Memory({}); 
myObservableDataStore = new Observable(myCacheDataStore)  

Вы должны быть способны передать myObservableDataStore вместо myDataStore.

Чтобы обновить или обновить сетку, вы можете изменить целевой URL-адрес или обновить заголовки в myDataStore напрямую и вызвать grid.refresh. Я не проверял с обновлением заголовков, но мой пример изменения целевого URL из

/rest/users/ 

к

/rest/users/?username=jdoe 

и сетка обновляет штраф.

myDataStore.target = '/rest/users/?username=jdoe' 

или, может быть,

myDataStore.headers[paramName] = paramValue 

, так как ваш MyJsonRest магазин подмешать варианты, представленные в «получить» в заголовки, а также.

+0

Спасибо за ответ. Как я могу обернуть над кодом в наблюдаемом? – yetanothercoder

+0

Извините за неопределенный ответ. Я добавил фрагмент кода, это предполагает, что у вас есть запрос dojo/store/Observable – xangxiong

+0

Я пробовал, что сказал. Но это не работает. Нет ошибок. Но теперь он также не отображает сетку с исходными данными. – yetanothercoder

0

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

Вы звоните get в свой магазин, а затем вызываете grid.refresh() внутри обработчика успеха для этого вызова. Поскольку вы используете серверный магазин, get собирается запустить один запрос самостоятельно. Сетка собирается запустить другой запрос (через метод query магазина), чтобы получить список элементов для заполнения.

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