Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   Как изменить динамически произвольный html внутри панели (https://javascript.ru/forum/extjs/52960-kak-izmenit-dinamicheski-proizvolnyjj-html-vnutri-paneli.html)

WalterScott 14.01.2015 22:00

Как изменить динамически произвольный html внутри панели
 
Имеется таб-панель. В левом правом углу нужно вывести ссылку при наличии соответствующих прав у пользователя, а если их нет, то не выводить.
Пробую так
var createAlbum = '';
		
		var albumsTab = {
			title: 'Альбомы',
			id: 'albumsTab',
			items: [
			{
				xtype: 'panel',
				layout: {
					type: 'vbox',
					align: 'stretch'
				},
				items: [
				{
					html: createAlbum
				}, previews	
				]
			}
			]
		};
		var userPermissionStore = Ext.create('UserPermissionStore');
		userPermissionStore.load(function() {
			userPermissionStore.each(function(record) {
				perm = record.get('perm');
				if (perm == 'yes') {
					albumsTab.items[0].items[0].html = '<b><a onclick="return newAlbumWindowShow()" href="">Создать альбом</a></b>'
					+ '<br/><br/>';
				} else {
					albumsTab.items[0].items[0].html = 'Ты не прав, Борис';
				}
			});
		});

Проверка прав работает нормально. Вопрос в том, как изменить значение св-ва html.

Infarch 15.01.2015 12:14

А если попробовать не через свойство, а методом update?

Заодно хочу заметить что такие вот цепочки: items[0].items[0]. это потенциальный источник багов. Стоит что-то добавить в айтемы и все рушится. Воспользуйтесь референсами. Еще мысль: если вам надо просто получить "yes" с сервера то зачем стор? Ext.Ajax вам поможет. Если же там более сложная структура (объект) то десериализуйте его из строки ответа.

WalterScott 15.01.2015 23:27

Спасибо, получилось:
var albumsTab = {
			title: 'Альбомы',
			id: 'albumsTab',
			items: [
			{
				xtype: 'panel',
				layout: {
					type: 'vbox',
					align: 'stretch'
				},
				items: [
				{
					html: '<div id="createAlbum">&nbsp;</div>'
				}, previews	
				]
			}
			]
		};
		var userPermissionStore = Ext.create('UserPermissionStore');
		userPermissionStore.load(function() {
			userPermissionStore.each(function(record) {
				var perm = record.get('perm');
				if (perm == 'yes') {
					Ext.fly('createAlbum').update('<b><a onclick="return newAlbumWindowShow()" href="">Создать альбом</a></b><br/><br/>');
				}
			});
		});


Постараюсь завтра заменить стор на Ext.Ajax.

Infarch 16.01.2015 12:57

Рад что вы на верном пути :)

Но вот еще один момент - а вы уверены что именно ссылкой надо вызывать функцию для создания альбома? Все же экст позволяет абстрагироваться от html, и в этом его несомненный плюс. Вы можете использовать кнопку, сделать ее неактивной или даже невидимой, а после проверки включить. Не видя всего кода сложно давать более точные рекомендации, однако подумайте над этим.

WalterScott 17.01.2015 17:47

Вложений: 1
Мне кажется, что ссылка тут больше подходит. Приложил скриншот - можете посмотреть.
Но сейчас у меня обнаружилась новая печаль.
Заменил Store на Ext.Ajax. Почему-то работает это только на Firefox(смотрю также на IE и Opera).
Ext.Ajax.request({
		   url: '../?cgu_check=check',
		   success: function(response, opts) {
			  if (response.responseText) {
					Ext.fly('createAlbum')
					.update('<b><a onclick="return newAlbumWindowShow()" href="">Создать альбом</a></b><br/><br/>');			  
			  }
		   },
		   failure: function(response, opts) {
			  alert('server-side failure with status code ' + response.status);
		   }
		});

Помимо того, что Store заменил на Ajax, я теперь передаю с сервера булево значение вместо yes или no. Подумал, может IE и Opera распознают значения true и false как строки. Вернул yes/no
if (response.responseText == 'yes') {
					Ext.fly('createAlbum')
					.update('<b><a onclick="return newAlbumWindowShow()" href="">Создать альбом</a></b><br/><br/>');			  
			  }
По прежнему в IE и Опере не работает.
Пока вернулся к стору.

Infarch 18.01.2015 14:34

Ну ссылка так ссылка, вам виднее.

Насчет булевского значения: попробуйте вернуть с сервера json строку типа такой: "{mayCreateAlbums:true}" и десериализовать:

var obj = Ext.decode(response.responseText);

Потом анализируйте это свойство объекта.

WalterScott 18.01.2015 16:51

Да нет, с булевским значением-то нет проблем.

WalterScott 18.01.2015 19:58

Нет, всё нормально работает с Ext.Ajax во всех браузерах.
Просто я проверял в IE и Опере, когда сам был залогинен в Firefox :lol:
Естественно, в IE и Опере при этом сессии не было.
У меня эта штука интегрирована с Wordpress и проверяет права пользователя WP.


Часовой пояс GMT +3, время: 19:46.