Sencha Touch MVC - рекомендуемые способы передачи данных через контроллер? - PullRequest
10 голосов
/ 03 марта 2011

Я использую Sencha Touch для мобильного приложения и использую в нем функциональность MVC.Мне очень нравится Sencha, но у меня возникают небольшие проблемы, когда речь идет о передаче данных с одного «экрана» на другой с помощью контроллера.

Существует свойство «record», связанное с числомВиджеты Sencha - указывающие на текущую выбранную запись, например, в Ext.list - и по какой-то причине я не могу понять, как передать нечто подобное из Ext.Panel в другую.

Например, у меня есть Ext.Panel с данными из Ext.Store, включая адрес.У меня есть другая Ext.Panel, которая покажет карту.Мне нужно передать этот адрес на панель карты, но я не уверен, как.Вот что я пытаюсь из первой панели:

                listeners: {
                'tap': function () {
                    Ext.dispatch({
                        controller: app.controllers.establishments,
                        action: 'showMap',
                        id: record.getId(),
                        data: record.data
                    });
                }

Я немного колеблюсь, как вы можете видеть, пытаясь использовать в контроллере опцию «id» и «data» впопытаться получить данные на панель карты любым способом.

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

Если это поможет, я основываю структуру моего приложения на хорошем учебнике MVC, написанном Мистером Пирсом в Сенче:

http://www.sencha.com/learn/Tutorial:A_Sencha_Touch_MVC_application_with_PhoneGap

Большое спасибо!

Ответы [ 4 ]

6 голосов
/ 03 марта 2011

Я думаю, что вы на правильном пути с Ext.Dispatch. Параметры, добавляемые вами в объект параметров отправки, передаются методу действия на контроллере.

* 1003 Е.Г. *

showMap: function(options){ 
               var id = options.id; 
               //load data based on the id and pass it to your map
               ...
         }

Я также думаю, что вы должны установить historyUrl для объекта «Параметры отправки», чтобы при обновлении страницы идентификатор все равно отправлялся в действие контроллера.

3 голосов
/ 03 марта 2011

Я не слишком знаком с этим шаблоном MVC, но у меня большой опыт работы с ExtJS, и, на мой взгляд, лучший способ взаимодействия компонентов - это события. В вашем примере вы должны создать событие на Panel, например «addAddress», и карта будет прослушивать это событие. И когда адрес был установлен на панели, вы звоните.

this.addEvent('addAddress');

this.fireEvent('addAddress', this, address);

и на карте будет такой слушатель, как

onAddress: function(panel, address) {
   // do something with the address
}

и в вашем приложении верхнего уровня вы добавите слушателя.

app.mon(panel, 'addAddress', map.onAddress, this);

Как правило, это лучше для ваших компонентов таким образом, чтобы Panel не зависела от карты и наоборот

0 голосов
/ 09 июня 2014

Отвечая на очень старый вопрос, я полагаю, что в текущих версиях Sencha touch (2.2+) у нас есть альтернативный метод, который я предпочитаю. Вот это для вашей оценки.

Альтернативой является использование функции маршрутов контроллеров.

ПРИМЕЧАНИЕ: Ext.Dispatch устарел в Sencha Touch 2.2, если вы все еще хотите использовать метод диспетчеризации, вам нужно получить контроллер и вызвать метод для него, как описано здесь. Как передавать данные между экранами в sencha touch2.0?

Сначала вы определяете маршруты, которыми интересуется контроллер.

Ext.define('My.controller.Profile', {
extend: 'Ext.app.Controller'
,config: {
    routes: {
        'products/:id': 'showProduct'
    }
}
,showProduct: function(id) {
    console.log('Load and Show product... ' + id);
}

});

Далее вы создаете ссылку, URL-адрес которой имеет формат href:

<a href="#products/1234">View Product</a>

Нажатие на ссылку вызовет метод контроллеров Product showProduct с id, установленным в 1234.

Или, если вы хотите сделать это программно, вы можете написать:

location.hash = "products/1234";

, который будет иметь тот же эффект.

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

0 голосов
/ 11 ноября 2011

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

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

...