2015-04-08 4 views
0

Я новичок в Sencha Touch ...Sencha Touch, setRecord() не работает. Поля пусты.

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

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

У меня есть вид с вкладками. Первая вкладка отображает список элементов. Нажмите раскрытие позиции, чтобы просмотреть сведения об этом элементе. Появится подробный вид, но без каких-либо данных.

  • Вкладки настраиваются в функции запуска ViewPortController.
  • Основной вид на первой вкладке - PeopleListView. Все люди появляются в списке.
  • PeopleListView добавлен в Ext.NavigationView. Ссылка на Ext.NavigationView добавляется в PeopleListView, поэтому ее можно использовать позже
  • PeopleListViewController имеет функцию showDetailView, которая успешно вызывается при нажатии кнопки раскрытия.
  • функция showDetailView контроллера
    • устанавливает запись (которая содержит правильные данные) на personDetailView,
    • извлекает экземпляр Ext.NavigationView и толкает PersonDetailView.
  • Значение записи, переданное в showDetailView, содержит правильные данные.
  • При появлении personDetailView поля не имеют данных.

ViewPortController:

launch: function() { 
    // var personDetailView = { 
    // xtype: 'persondetailview' 
    // } 
    var pplView = Ext.create('PeopleApp.view.PeopleListView'); 
    var pplNavView = Ext.create('Ext.NavigationView', { 
     title: 'People', 
     iconCls: 'home', 
     useTitleForBackButtonText: true, 
    }); 
    pplView.setNavigationView(pplNavView); 
    pplNavView.add(pplView); 
    . . . 
    var mainViewPort = getMainViewPort(); 
    mainViewPort.setItems([pplNavView, . . .]); 
}, 

PersonModel:

Ext.define('PeopleApp.model.PersonModel', { 
extend: 'Ext.data.Model', 
requires: ['Ext.data.proxy.Rest'], 
config: { 
    idProperty: 'id', 
    fields: [ 
     { name: 'id',  type: 'auto' }, 
     { name: 'name',  type: 'string' }, 
     { name: 'address', type: 'string' }, 
     { name: 'email', type: 'string' }, 
     { name: 'age',  type: 'int' }, 
     { name: 'gender', type: 'string' }, 
     { name: 'note',  type: 'string' } 
    ], 
    proxy: { 
     type: 'rest', 
     url: '/app/data/people.json', 
     reader: { 
      type: 'json', 
      rootProperty: 'people' 
     } 
    }, 
} 
}); 

PeopleListViewController:

Ext.define('PeopleApp.controller.PeopleListViewController', { 
extend: 'Ext.app.Controller', 
xtype: 'peoplelistviewcontroller', 
config: { 
    refs: { 
     peopleListView: 'peoplelistview', 
     personDetailView: 'persondetailview', 
     peopleView: 'peopleview', 
    }, 
    control: { 
     peopleListView: { 
      discloseDetail: 'showDetailView' 
     } 
    } 
}, 

showDetailView: function(view, record) { 
    console.log("record.data.name=" + record.data.name); 

    var detailView = Ext.create('PeopleApp.view.PersonDetailView'); 
    //var detailView = this.getPersonDetailView(); 
    detailView.setRecord(record); 
    var navView = view.getNavigationView(); 
    navView.push(detailView); 
}, 

launch: function() { this.callParent(arguments); }, 
init: function() { this.callParent(arguments); }, 
}); 

PersonDetailView:

Ext.define('PeopleApp.view.PersonDetailView', { 
extend: 'PeopleApp.view.BaseView', 
xtype: 'persondetailview', 
requires: [ 
    'Ext.form.FieldSet', 
    'Ext.form.Text', 
    'Ext.form.TextArea' 
], 
config: { 
    title: "Person Details", 
    scrollable: true, 
    items: [{ 
     xtype: 'fieldset', 
     items: [{ 
       xtype: 'textfield', 
       name: 'name', 
       label: 'Name: ', 
       required: true 
      }, { 
       xtype: 'textfield', 
       name: 'age', 
       label: 'Age: ', 
       required: false 
      }, // etc. 
     ]} 
    ]} 
}); 

Можете ли вы рассказать мне, почему detailView.setRecord (запись) не получает данные, заданные в полях DetailViewController, и что мне нужно делать по-другому?

ответ

0

Я не уверен, но вы должны использовать ниже кода в Person детальном:

items: [ 
    { 
     xtype:'formpanel', 
     id:'personDetailViewForm', 
     items:[{ 
       xtype: 'fieldset', 
       items: [{ 
        xtype: 'textfield', 
        name: 'name', 
        label: 'Name: ', 
        required: true 
        }, { 
        xtype: 'textfield', 
        name: 'age', 
        label: 'Age: ', 
        required: false 
        }, // etc. 
       ] 
      }] 
     }] 

и в personListViewController вы можете установить значения, которые образуют вместо настроечных записей с точки зрения, как:

var detailView = Ext.create('PeopleApp.view.PersonDetailView'); 
    var personDetailViewForm = detailView.down('#personDetailViewForm '); 
    personDetailViewForm .setValues(records); 

Обратите внимание, что имена объектов объектов и имена полей формы должны совпадать, и если records не работает, попробуйте с records.data.

+0

Спасибо за ответ.Ничего себе, массивы элементов вложены в 3 уровня. Я не видел функцию .down. Я попробовал. Теперь мой personDetailView выглядит пустым. Даже не появляются поля или ярлыки. – jimmyg

+0

Ответ: У вашего предложения был xtype: 'formpanel', который был на правильном пути. PersonDetailView расширяет PeopleApp.view.BaseView, который по очереди расширяет Ext.Container. Когда я изменил расширение Ext.form.Panel (а не Ext.Panel, которое я также пробовал), все сработало хорошо. Благодаря! – jimmyg

Смежные вопросы