Вопрос

Добавление кастомных элементов в мобильном приложении

Всем доброго времени суток.

Версия 7.10.

Возможно ли в мобильном приложении добавлять кастомные элементы, как в браузерной версии системы?

К примеру, кнопку, на которую добавлен вызов функции? Или создать свой контрол, генерирующий свой html-код?

Если да, то можно ли посмотреть примеры (хотя бы пример с кнопкой)?

У меня такой же вопрос

10 комментариев

Вот здесь, например есть инструкция по созданию своего контрола: http://www.community.terrasoft.ru/forum/topic/25285#comment-67717

Можно ли такое же сделать для мобильного приложения?

В конфиге вью определяем нужный контрол + метод для его отображения, а в контроллере завязываем на него обработчик:

Ext.define("...вью...", {
    config: {
       refreshButton: {
            id: 'usr_order_refresh_btn',
            cls: "x-button-primary-blue",
            text: 'Обновить'
        }
    },
    showRefreshButton: function (isShow) {
        var navigationPanel = this.getNavigationPanel(); /*компонент в котором нужно отобразить контрол*/
        var refreshButton = this.getRefreshButton();
        if (isShow) {
            this._refreshButton = navigationPanel.addButton(refreshButton);
        } else {
            navigationPanel.removeButton(refreshButton);
        }
        return this._refreshButton;
    }
});
Ext.define("...контроллер...", {
    initializeView: function (view) {
        this.callParent(arguments);
        var btn = view.showRefreshButton(true);
        btn.on("tap", this.onRefreshButtonTap, this);
    },
    onRefreshButtonTap: function() {
        /* сабж  */
    }
});

Ещё раз большое спасибо!

Два вопроса ещё есть:

1. Где-нибудь можно найти список компонентов? Вот, например, есть MobileOpportunityEditPage, можно ли кнопку добавить не на навигационную панель, а допустим прямо между колонками - как на картинке (не обязательно именно так, дизайн может быть любым.. вопрос в возможности)?

2. А если речь идёт именно о своём элементе? Допустим, просто вывести блок html.

Могу сказать, в принципе, чтобы было понятно: началось всё с идеи добавить туда canvas, для того, чтобы клиент мог подписать договор "на экране планшета". В браузерной версии всё по кр.мере понятно - там делается контрол по инструкции из комментария выше, и в нужное место на странице добавляется блок с канвасом. Далее делаются обработчики для него, и всё такое. А вот можно ли повторить это в приложении...

В таком случае можно свой контрол определить также, как и в инструкции для веб, и сделать так:

Ext.define("...контроллер...", {
	onLoadRecord: function(loadedRecord, callback) {
		  this.callParent([loadedRecord, function() {
				 var panelItems = this.getView().getPanel().getItems();
				  /* собственно здесь хранятся панели и детали страницы*/
				 var primaryColumnSet = panelItems.first(),
                                      control = this.getOurCustomControl(loadedRecord);
				 primaryColumnSet.add(control); //если добавляем в конце панели
                                 primaryColumnSet.insert(index, control); //в определенное место
		  }
	},
	getOurCustomControl: function(record) {
 
	}
}

А можно на примере - что может быть указано в getOurCustomControl во втором случае, если не трудно?
До конца не могу понять, как в этом случае правильно указывать.

Например, если я заменяю в showRefreshButton функцию this.getNavigationPanel() на this.getPanel().getItems().first() и далее addButton на add - то блок появляется на странице, но не виден из-за отсутствия текста в нём (а при addButton ошибка).

А например, this.getItems().first() - работает как getNavigationPanel.

onLoadRecord: function(loadedRecord, callback) {
      this.callParent([loadedRecord, function() {
         var panelItems = this.getView().getPanel().getItems();
          /* собственно здесь хранятся панели и детали страницы*/
         var primaryColumnSet = panelItems.first(),
              control = this.getOurCustomControl(loadedRecord);
         primaryColumnSet.add(control); //если добавляем в конце панели
      }]);
    },
    getOurCustomControl: function(record) {
		return '<div id="testDiv"></div>';
    },

В таком случае вываливается ошибка.

sencha-touch-all-debug.js:86794 Uncaught Error: [ERROR][Ext.Container#factoryItem] Invalid config, must be a valid config object

допустим так:

onLoadRecord: function(loadedRecord, callback) {
      this.callParent([loadedRecord, function() {
         var panelItems = this.getView().getPanel().getItems();
          /* собственно здесь хранятся панели и детали страницы*/
         var primaryColumnSet = panelItems.first(),
              control = this.getOurCustomControl(loadedRecord);
         control .on("tap", function () {
                        Terrasoft.MessageBox.showMessage("hello world");
         }, this);
         primaryColumnSet.add(control); //если добавляем в конце панели
      }]);
    },
    getOurCustomControl: function(record) {
                return Ext.create('Ext.Button', {
                      xtype: "button",
                      cls: "x-button x-button-link",
                      text: "?"
                    });
    }
}

Огромное спасибо! Теперь понял))

И всё-таки в качестве завершающего аккорда - можно ли вывести туда свой html код? Можно конечно сгенерить пустой блок и поставить туда через innerHTML, допустим такой код:

<div id="myDiv" style="width: 100%; height: 150px; background-color: #eee">Мой блок</div>

или тот же канвас, с которого всё начиналось:

<canvas id="myCanvas" width='350' height='150' style="background-color: #eee; border: 1px solid #ccc;"></canvas>

Но насколько правильно так поступать в данном случае? И будет ли это работать на всех видах устройств?

return Ext.create("Ext.Toolbar", {
            id: 'myCanvas-toolbar',
            html: "<canvas id="myCanvas" width='350' height='150' style="background-color: #eee; border: 1px solid #ccc;"></canvas>",
            height: '60px'
        })

Спасибо!!

Работает, больше вопросов наверно не имею)

Войдите или зарегистрируйтесь, чтобы комментировать