Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 26.12.2016, 07:10
Аватар для Sogl
Аспирант
Отправить личное сообщение для Sogl Посмотреть профиль Найти все сообщения от Sogl
 
Регистрация: 12.05.2016
Сообщений: 95

nohuhu, Посмотрите?
Ответить с цитированием
  #12 (permalink)  
Старый 09.01.2017, 23:29
Аватар для nohuhu
Профессор
Отправить личное сообщение для nohuhu Посмотреть профиль Найти все сообщения от nohuhu
 
Регистрация: 21.05.2015
Сообщений: 321

Sogl,

Прошу прощения, был в отпуске, а потом закрутился. Надеюсь, что ещё не поздно.

Если я правильно понял ваше последнее сообщение, то вам нужно закрыть маской всю TabPanel изначально, до момента, пока не выбрана запись в Grid с левой стороны. В таком случае, почему бы не использовать привязку (binding) к выбранной записи в 1-м Grid, точно так же, как вы делаете во втором Grid? У каждого компонента есть метод setLoading, так что можно сделать вот такую привязку:

bind: {
    loading: '{!customerGrid.selection.orders}'
}


Это не решит вопрос с изначальным маскированием TabPanel, т.к. bindings стреляют только в момент обновления. Для этого как раз подойдёт событие boxready на самой TabPanel:

listeners: {
    boxready: function(panel) {
        panel.setLoading({ useMsg: false });
    }
}


Я подправил и сохранил ваш fiddle, можете посмотреть вживую. Если что-то работает не так, как надо, уточните задачу.
Ответить с цитированием
  #13 (permalink)  
Старый 10.01.2017, 01:32
Аватар для Sogl
Аспирант
Отправить личное сообщение для Sogl Посмотреть профиль Найти все сообщения от Sogl
 
Регистрация: 12.05.2016
Сообщений: 95

Не поздно =)

Сообщение от nohuhu
Если я правильно понял ваше последнее сообщение, то вам нужно закрыть маской всю TabPanel изначально, до момента, пока не выбрана запись в Grid с левой стороны.
Не так. Должны маскироваться элементы items этой TabPanel, а не вся панель. Таким образом остается возможность пользоваться вкладками, но поменять в них ничего нельзя, пока не нажмешь на строку 1-й Grid.

Попробовал перенести ваш код в секцию defaults, но маска с элементов так и не снимается.

Еще так и не понял как работает вот такая запись и почему в ней стоит оператор логического НЕ:
bind: {
    loading: '{!customerGrid.selection.orders}'
}


p.s. Кстати, Sencha Fiddle не показывает внесенные сторонние изменения в созданных fiddle? А то так сложно понять что было изменено.

Последний раз редактировалось Sogl, 10.01.2017 в 01:49.
Ответить с цитированием
  #14 (permalink)  
Старый 12.01.2017, 22:25
Аватар для nohuhu
Профессор
Отправить личное сообщение для nohuhu Посмотреть профиль Найти все сообщения от nohuhu
 
Регистрация: 21.05.2015
Сообщений: 321

Сообщение от Sogl Посмотреть сообщение
Не так. Должны маскироваться элементы items этой TabPanel, а не вся панель. Таким образом остается возможность пользоваться вкладками, но поменять в них ничего нельзя, пока не нажмешь на строку 1-й Grid.
В таком случае надо использовать maskElement: 'body', чтобы маска накладывалась на элемент body, а не основной el. См. fiddle.

Цитата:
Еще так и не понял как работает вот такая запись и почему в ней стоит оператор логического НЕ:
bind: {
    loading: '{!customerGrid.selection.orders}'
}
Это частично ошибочная строка, я второпях зачем-то использовал ассоциацию не на выбранную запись в customerGrid, а на данные в этой записи. Прошу прощения за конфуз. :) Должно выглядеть вот так:

bind: {
    loading: '{!customerGrid.selection}'
}


Ассоциация customerGrid.selection публикуется компонентом customerGrid и содержит выделенную запись в customerGrid. С левой стороны у нас название "config", который нужно изменить, когда меняется ассоциация. "Config" в кавычках, потому что на самом деле у компонентов нет опции loading, которую можно было бы сконфигурировать, но есть метод setLoading, который можно вызвать. Binding всё равно, конфиг это или нет, оно дёрнет метод и скормит ему данные из ассоциации, когда эти данные изменяются.

Дальше к оператору. Когда выделенных записей нет, нужна маска. Когда запись есть, маска не нужна - обратная логическая связь. Когда выделение есть, свойство customerGrid.selection содержит объект с выделенной записью. Когда выделения нет, это свойство равно null. Использованием логического НЕ мы убиваем двух зайцев: во-первых, инвертируем логическую связь в нужную нам сторону (есть запись - нет маски, и наоборот); во-вторых, приводим truthy объект "запись" к булевому значению true, или null к булевому false. Если бы нам нужна была прямая связь, то я бы использовал '{!!customerGrid.selection}', просто чтобы в метод setLoading передавалось всегда булевое значение, а не запись. Меньше потенциальных поводов для головной боли.

Цитата:
p.s. Кстати, Sencha Fiddle не показывает внесенные сторонние изменения в созданных fiddle? А то так сложно понять что было изменено.
Нет, такое Fiddle пока не умеет.
Ответить с цитированием
  #15 (permalink)  
Старый 13.01.2017, 03:36
Аватар для Sogl
Аспирант
Отправить личное сообщение для Sogl Посмотреть профиль Найти все сообщения от Sogl
 
Регистрация: 12.05.2016
Сообщений: 95

nohuhu, Огромное спасибо!

Теперь все работает как надо. Изначально я пытался маскировать каждый item в TabPanel и снимать маску со всех них по rowclick, а оказалось, что проще всего выставить maskElement: 'body' и не нужны никакие лишние телодвижения. Красота.

Есть один непонятный момент.

Как я понял из вашего описания и доки, вот эта запись:
listeners: {
    boxready: function(panel) {
        panel.setLoading({ useMsg: false });
    }
},

выставляет маску без сообщения на ней (т к useMsg: false) перед загрузкой контейнера и после раскладки элементов DOM. Вы выше писали, что bind срабатывает только на обновление.

По идее, без данного кода маска примениться не должна. Однако, без него вечно отображаться "Loading..." пока не кликнем на строку Grid, т е каким-то образом стандартная маска появляется. Почему?

Фидл с этим моментом:
https://fiddle.sencha.com/#fiddle/1mls

Комментирую код c bind, возвращая boxready на место — все ОК, маска есть. Без этих 2х кусков кода никаких масок, что и должно быть.
Ответить с цитированием
  #16 (permalink)  
Старый 13.01.2017, 22:34
Аватар для nohuhu
Профессор
Отправить личное сообщение для nohuhu Посмотреть профиль Найти все сообщения от nohuhu
 
Регистрация: 21.05.2015
Сообщений: 321

"Loading..." это сообщение по умолчанию, если вызвать просто setLoading(true). В какой-то момент стреляет binding и, поскольку выделенной записи нет, накладывает маску с сообщением. Мне показалось, что это выглядит довольно странно, поэтому я добавил обработчик boxready, чтобы снова установить маску, но уже без сообщения.

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

А если подумать, такая конфигурация была бы хорошей идеей. EXTJS-23472. :)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
JS для append элементов cuoresanguinato Элементы интерфейса 4 05.08.2016 21:13
Программный вызов событий для конкретных элементов iNfantry jQuery 9 31.01.2012 15:21
HTA-приложение для радио Pianorama Magneto Ваши сайты и скрипты 42 22.01.2012 08:34
Некорректно работает функция для создания элементов exec Общие вопросы Javascript 4 13.07.2010 11:15