2012-06-13 6 views
3

Я пытаюсь создать простую пользовательскую настройку для моего школьного проекта.
Я создал модель данных, как так:Ext JS 4 обратный вызов загрузки

Ext.define('Urlopy.Model.UserPreferences', { 
     extend : 'Ext.data.Model', 
     idProperty : 'userID', 
     fields : [{ 
        name : 'userID', 
        type : 'string' 
       }, { 
        name : 'admin', 
        type : 'bool' 
       }] 
    }); 

и магазин, как это:

Ext.define('Urlopy.Store.UserPreferences', { 
     extend : "Ext.data.Store", 
     autoLoad : false, 
     autoSync : true, 
     batch : false, 
     proxy : { 
      type : 'ajax', 
      sortParam : undefined, 
      startParam : undefined, 
      pageParam : undefined, 
      limitParam : undefined, 
      noCache : false, 
      headers : { 
       "Content-Type" : "application/json; charset=utf-8" 
      }, 
      api : { 
       read : 'services/UserPreferences.asmx/Get', 
       update : 'services/UserPreferences.asmx/Update' 
      }, 
      reader : { 
       type : 'json', 
       root : 'd.data' 
      }, 
      writer : { 
       type : 'json', 
       encode : false, 
       writeAllFields : true, 
       root : 'data' 
      } 
     }, 
     model : 'Urlopy.Model.UserPreferences' 
    }); 

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

У меня есть функция, например, так:

onLogin : function() { 

      this.createGlobalStores(); 

      this.userPreferenceStore.load({ 

         callback : function(r, options, success) { 
          console.log(r.data) 
         } 

        }); 

     }, 
     createGlobalStores : function() { 
      this.userPreferenceStore = Ext.create("Urlopy.Store.UserPreferences"); 
     }, 

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

Прямо сейчас все, что я получаю, не определено, что показано в firebug.

Мои данные JSON от сервера выглядит следующим образом:

{"d":{"__type":"Urlopy.services.UserPreference","userID":"12445","admin":true}} 

Мне нужно, чтобы иметь возможность вызвать метод нагрузки на этом магазине и в обратном вызове получить конкретное свойство от модели. В моем магазине всегда будет 1 товар! (есть ли другой способ сделать это?)

Любые идеи о том, почему это не работает, приветствуются!

EDIT Я изменил мой сценарий сервера вернуть JSON как это:

{"d":{"data":{"userID":"12-44-55","admin":true}}} 

Это прекрасно работает, не было никакой необходимости добавлять дополнительные [] вокруг объекта.

ответ

7

Прежде всего, загрузка для магазина ожидает массив, а второй - неправильный корень для прокси. поскольку в вашем json нет объекта d.data. Простое исправление будет кодировать данные JSON как массив с одним элементом, а тег для этого массива, чтобы быть «данные» ...

{"d":[{"__type":"Urlopy.services.UserPreference","userID":"12445","admin":true}]} 

и просто установить корень д

reader : { 
    type : 'json', 
    root : 'd' 
} 

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

callback : function(records, options, success) { 
    console.log(records[0].data.userID +" " + records[0].data.admin); 
} 

EDIT

Другой метод, не связанных магазинов

ли простой запрос AJAX, как:

Ext.Ajax.request({ 
      url: 'services/UserPreferences.asmx/Get', 
      params: {/*if you want any extra params to be sent*/}, 
      scope: this, 
      success: function (result) { 
       var response = Ext.decode(result.responseText); 
       //this is for your initial json 
       alert(response.d.userID); 
      }, 
      failure: function (result) { 
       alert('something failed')  
      } 
     }); 

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

+0

Хм .. Я исправлю это сразу? Есть ли другие возможности для загрузки этого объекта вместо массива? Я знаю, что я могу использовать Store, но может быть, есть другой способ? – Misiu

+0

Спасибо за это редактирование :) то, что я хотел бы иметь, - это глобальный объект, содержащий всю конфигурацию пользователя, и я смогу прочитать настройки и обновить их. Мне удалось это сделать. Я отредактировал свой вопрос с моим решением, основанным на вашем. – Misiu