2016-09-27 1 views
1

Мы используем Extjs 5.x для создания одностраничного приложения на основе браузера. Все работает нормально, если используется простая модель &. Если мы пытаемся использовать любую оболочку для прокси-сервера, она генерирует ошибку во время выполнения после того, как sencha cmd build.Имеет ли данные Extjs Model/Store поддержку любого метода-посредника прокси-сервера?

Вот простая модель статьи:

Ext.define('Pos.model.Article', { 
    extend  : 'Ext.data.Model', 
    alias  : 'widget.Article', 
    idProperty : 'id', 
    fields  : [ 
     { name : 'id',   mapping : 'id',   type : 'int' }, 
     { name : 'code',  mapping : 'code',  type : 'string'}, 
     { name : 'name',  mapping : 'name',  type : 'string'}, 
     { name : 'rate',  mapping : 'rate',  type : 'float' }, 
     { name : 'expireDate', mapping : 'expireDate', type : 'date' } 
    ], 
    proxy  : { 
     type   : 'rest', 
     noCache   : true, 
     limitParam  : 'limit', 
     startParam  : 'start', 
     url    : '/pos/article', 
     reader   : { 
      type   : 'json', 
      rootProperty : 'data', 
      totalProperty : 'total', 
      successProperty : 'success', 
      messageProperty : 'message', 
      implicitIncludes: true 
     }, 
     writer   :{ 
      type   : 'json', 
      writeAllFields : true 
     }, 
     simpleSortMode : true 
    } 
}); 

Вот простой магазин статьи:

Ext.define('Pos.store.Articles', { 
    extend  : 'Ext.data.Store', 
    model  : 'Pos.model.Article', 
    idProperty : 'id', 
    autoLoad  : false, 
    autoSync  : false,  
    remoteSort : true, 
    remoteFilter : true, 
    pageSize  : 25, 
    proxy  : { 
     type   : 'rest', 
     noCache   : true, 
     limitParam  : 'limit', 
     startParam  : 'start', 
     url    : '/pos/article/store', 
     reader   : { 
      type   : 'json', 
      rootProperty : 'data', 
      totalProperty : 'total', 
      successProperty : 'success', 
      messageProperty : 'message', 
      implicitIncludes: true 
     }, 
     writer   :{ 
      type   : 'json', 
      writeAllFields : true 
     }, 
     simpleSortMode : true 
    }, 
    sorters  : [{ 
     property : 'name', 
     direction: 'ASC' 
    }] 
}); 

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

var Cki=Cki||{}; 

;Cki.proxy||(function($){ 
    var proxy = { 
     $package  : 'Cki', 
     $class  : 'Cki.proxy', 
     resolveUrl : function(action){ 
      var ctxPath = '/pos/', 
       url  = ctxPath + action; 

      return url; 
     }, 
     getReader   : function(){ 
      var reader = { 
        type   : 'json', 
        rootProperty : 'data', 
        totalProperty : 'total', 
        successProperty : 'success', 
        messageProperty : 'message', 
        implicitIncludes: true 
       }; 
      return reader; 
     }, 
     getWriter   : function(){ 
      var writer = { 
        type   : 'json', 
        writeAllFields : true 
       }; 
      return writer; 
     }, 
     getRestProxy  : function(url, noCache){ 
      url  = (typeof url === 'undefined') ? '' : url; 
      noCache = (typeof noCache === 'undefined') ? false : noCache; 
      var restProxy = { 
       type   : 'rest', 
       noCache   : noCache, 
       limitParam  : 'limit', 
       startParam  : 'start', 
       url    : proxy.resolveUrl(url), 
       reader   : proxy.getReader(), 
       writer   : proxy.getWriter(), 
       simpleSortMode : true 
      };  
      return restProxy; 
     } 
    }; 
    $.proxy = proxy; 
}(Cki)); 

После обертка метода прокси-строителя готов, мы могли бы использовать его для упаковки прокси внутри модели и магазина. Вот обернутый прокси Модель:

Ext.define('Pos.model.Article', { 
    extend  : 'Ext.data.Model', 
    alias  : 'widget.Article', 
    idProperty : 'id', 
    fields  : [ 
     { name : 'id',   mapping : 'id',   type : 'int' }, 
     { name : 'code',  mapping : 'code',  type : 'string'}, 
     { name : 'name',  mapping : 'name',  type : 'string'}, 
     { name : 'rate',  mapping : 'rate',  type : 'float' }, 
     { name : 'expireDate', mapping : 'expireDate', type : 'date' } 
    ], 
    proxy  : Cki.proxy.getRestProxy('article') 
}); 

Вот завернутые Proxy Store:

Ext.define('Pos.store.Articles', { 
    extend  : 'Ext.data.Store', 
    model  : 'Pos.model.Article', 
    idProperty : 'id', 
    autoLoad  : false, 
    autoSync  : false,  
    remoteSort : true, 
    remoteFilter : true, 
    pageSize  : 25, 
    proxy  : Cki.proxy.getRestProxy('article/store'), 
    sorters  : [{ 
     property : 'name', 
     direction: 'ASC' 
    }] 
}); 

Это генерирует следующее сообщение об ошибке во время выполнения:

  1. Синхронный XMLHttpRequest в основном потоке устарела из-за его вредного воздействия на опыт конечного пользователя. Для получения дополнительной помощи проверьте https://xhr.spec.whatwg.org/.
  2. http://localhost/pos/static/Ext-all.js Не удалось загрузить ресурс: сервер ответил со статусом 404 (не найден) выборки @ Ext-all.js: 22
  3. VM42: 3 Uncaught TypeError: C не является конструктором

ответ

2

это очень трудно найти свою ошибку без отладки, и я думаю, что было бы очень трудно даже с кодом ..

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

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

Пример

Ext.define('My.data.proxy.Rest', { 
     extend: 'Ext.data.proxy.Rest', 
     alias : 'proxy.myrest', 
     noCache   : true, 
     limitParam  : 'limit', 
     startParam  : 'start', 
     reader   : { 
      type   : 'json', 
      rootProperty : 'data', 
      totalProperty : 'total', 
      successProperty : 'success', 
      messageProperty : 'message', 
      implicitIncludes: true 
     }, 
     writer   :{ 
      type   : 'json', 
      writeAllFields : true 
     }, 
     simpleSortMode : true 
    }); 

И в вашем магазине вы будете иметь

Ext.define('Pos.store.Articles', { 
    extend  : 'Ext.data.Store', 
    model  : 'Pos.model.Article', 
    idProperty : 'id', 
    autoLoad  : false, 
    autoSync  : false,  
    remoteSort : true, 
    remoteFilter : true, 
    pageSize  : 25, 
    proxy  : { 
     type: 'myrest', 
     url: '/pos/article/store', 
    }, 
    sorters  : [{ 
     property : 'name', 
     direction: 'ASC' 
    }] 
}); 
+0

Является ли класс 'My.data.proxy.Rest' должно быть место для' ./overrides/data/proxy/ 'или где мы можем сообщить? –

+1

Я не думаю, что это должно быть переопределением, просто расширение .. Таким образом, вы можете разместить все, что захотите ... возможно, в папке с утилитами или что-то в этом роде. Вы должны добавить его в требуемую конфигурацию – fradal83