Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.07.2017, 23:58
Новичок на форуме
Отправить личное сообщение для OlegROA Посмотреть профиль Найти все сообщения от OlegROA
 
Регистрация: 18.07.2017
Сообщений: 4

Доступ к дочерним контроллерам из javascript
Добрый день!

С Angular`ом не работаю, но очень плотно приходится работать с сайтом, который использует сабж.
Для автоматизации многих действий на этом сайте использую python-скрипты, запускаемые на стороне клиента. Для получения данных с сайта использую прямые запросы к серверу и обычное "грабление".
Для внесения данных приходится использовать Selenium. И для ускорения заполнения форм часто использую js-скрипты, которые через контроллер записывают данные непосредственно в свойства модели.

Ссылку на контроллер получаю через angular.element(document.querySelector(css-селектор)).controller()
Но, на многих страницах используется несколько контроллеров, а с помощью вышеприведенного кода для любого dom-элемента всегда получаю ссылку только на один контроллер (родительский?)!
Использовать напрямую scope можно только после включения режима отладки (angular.reloadWithDebugInfo()), что не всегда можно использовать, т.к. при этом перегружается страница.

Как можно получить ссылки на другие контроллеры, используемые на странице?

Спасибо!
Ответить с цитированием
  #2 (permalink)  
Старый 19.07.2017, 19:15
Новичок на форуме
Отправить личное сообщение для OlegROA Посмотреть профиль Найти все сообщения от OlegROA
 
Регистрация: 18.07.2017
Сообщений: 4

К сожалению, ответов нет.

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

Т.е., что-то типа дочернего контроллера, который ничего делать не будет, но получит доступ ко всем свойствам и методам родительского контроллера. Что-то типа наследования в ООП-терминологии.

Если да, то нужно ли что либо (и что?) прописывать в этом дочернем контроллере, что бы вся обработка элемента производилась как и прежде родительским контроллером?
Ответить с цитированием
  #3 (permalink)  
Старый 19.07.2017, 19:46
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

OlegROA,
Никто не поможет, потому что Вы пишите очень странные вещи, которые похожи на адские костыли. Может лучше написать какая у Вас задача, что на вход, что на выход?
Ответить с цитированием
  #4 (permalink)  
Старый 20.07.2017, 03:04
Новичок на форуме
Отправить личное сообщение для OlegROA Посмотреть профиль Найти все сообщения от OlegROA
 
Регистрация: 18.07.2017
Сообщений: 4

Так вроде бы в первом сообщении подробно описал?

Есть сайт на AngularJS (версия 1.5.8), который используется для внесения информации и получения отчетов. Сайт написан и поддерживается сторонними разработчиками. Т.е., доступа к внутренностям сайта у нас нет.
Для автоматизации заполнения многих форм на сайте я использую python-скрипты в связке с Силениумом. Т.е., эмуляция действий пользователя в браузере.

Что бы не "бегать" по всем полям я с помощью js-скрипта (аналог действий в консоли разработчика любого браузера) получаю ссылку на контроллер (angular.element(document.querySelector("css-селектор")).controller()) и могу напрямую заполнять свойства модели.

Типа, ctrl.name="Иван"; ctrl.city="Москва" и т.д.

Так вот, на некоторых страницах используются несколько контроллеров. К примеру, головная форма на странице использует контроллер "MainFormCtrl". При нажатии на кнопочку создается dom-структура вложенной формы, которая использует уже другой контроллер "SubFormCtrl".

Вышеописанный код получения ссылки на контроллер для любого dom-элемента такой страницы всегда возвращает ссылку на "MainFormCtrl", через который я не могу получить доступ к свойствам вложенной формы! Название головного контроллера есть прямо в самом контроллере, а названия других контроллеров видны в коде js-модулей, подключенных к данной странице.

Так как включен продакшен-режим, то отладка отключена и получить ссылки на scope нужных элементов возможно только после вызова angular.reloadWithDebugInfo(), что вызывает дополнительную перезагрузку страницы с повторным ожиданием полной загрузки - т.е., значительно увеличивает время обработки форм на таких страницах.

Вот и спрашиваю совета у разработчиков, которые знают Angular изнутри - возможно ли каким либо образом с помощью js-кода получить доступ к свойствам вложенных моделей без необходимости включения режима отладки?
Или - возможно ли из консоли разработчика браузера получить ссылку на любой контроллер, используемый на текущей странице?

Просьба не предлагать надстройки браузеров типа Батаранга и ему подобных - во первых, нужна автоматизация а не ручное разглядывание доступных свойств (их имена я и так прекрасно вижу в ng-аттрибутах dom-элементов), во-вторых - в режиме отладки я и сам могу получить scope любых элементов на странице!

Последний раз редактировалось OlegROA, 20.07.2017 в 03:13.
Ответить с цитированием
  #5 (permalink)  
Старый 20.07.2017, 08:46
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

Цитата:
При нажатии на кнопочку создается dom-структура вложенной формы
Вкладывать формы в друг друга нельзя. Не понимаю, что у Вас там за структура?
<form ng-controller='MainFormCtrl'></form>

<form ng-controller='SubFormCtrl'></form>

и вам querySelector всегда возвращает ссылку на первую форму? Тогда querySelectorAll нужно использовать, идти по циклу и получить контроллер каждого из элементов в цикле.

https://plnkr.co/edit/m1VIxbWV0dsskR7mm1Ar?p=preview перейти в консоль, поменять iframe top => plunkerPreviewTarget и выполнить
[].forEach.call(document.querySelectorAll('form'), function(form){
	console.log(angular.element(form).controller())
})

А если эти формы как-то идентифицированы на странице, допустим
<form ng-controller='MainFormCtrl' id='main'></form>
<form ng-controller='SubFormCtrl' id='sub'></form>

то angular.element(document.querySelector("form#main" )).controller() вернет MainFormCtrl, а angular.element(document.querySelector("form#sub") ).controller() вернет SubFormCtrl
Ответить с цитированием
  #6 (permalink)  
Старый 22.07.2017, 05:35
Новичок на форуме
Отправить личное сообщение для OlegROA Посмотреть профиль Найти все сообщения от OlegROA
 
Регистрация: 18.07.2017
Сообщений: 4

Под формой я имел в виду не структуру form, а структуру из html-элементов, которые логически образуют "форму". На данной странице вообще нет <form>.
Т.е., грубо dom-структура основной "формы":
<main-form ng-if=...>Здесь поля "формы" из элементов div/select/input/button</main-form>

При нажатии на одну из кнопок, которая находится внутри <main-form>, здесь же, внутри <main-form>, создается структура:
<subform-create ng-if="mainFormCtrl.formVisible" items="mainFormCtrl.items" close-callback="mainFormCtrl.closeForm(data)">Здесь поля новой "формы", которые работают уже со своим контроллером. Типа:
 <select ng-options="group.id as group.name for group in subFormCtrl.groups" ng-model="subFormCtrl.newData.group_id" class="ng-pristine ng-untouched ng-valid ng-empty" aria-invalid="false">
И кнопка "Сохранить": <input type="submit" value="Сохранить" ng-click="subFormCtrl.createData()"></subform-create>

Так вот, обращение к любому из элементов как в основной "форме", так и в форме <subform-create> всегда выдает ссылку на mainFormCtrl!
Из него, естественно нет доступа к свойствам subFormCtrl.
Т.е., проблем с идентификацией dom-элементов и получением нужного элемента через querySelector НЕТ - есть проблема в получении ссылки на контроллер subFromCtrl!

P.S.
Если включить режим отладки и получить scope для любого из элементов "формы" <subform-create>, то в нем есть поле subFromCtrl со ссылкой на "дочерний" контроллер и есть поле Parent, через которое можно выйти на элемент основной формы с полем mainFormCtrl со ссылкой на основной контроллер.

В общем, судя по всему, внешним кодом никак нельзя получить ссылку на "дочерние" контроллеры - всегда будем получать ссылку на "родительский" контроллер.

Последний раз редактировалось OlegROA, 22.07.2017 в 05:56.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Доступ к оборудованию из JavaScript Curious Max Общие вопросы Javascript 0 08.03.2017 09:17
доступ к Java-пакетам из JavaScript Ssluap Общие вопросы Javascript 0 14.09.2012 21:56
Доступ к дочерним окнам, открытым ссылками с _blank Белый Тигр Events/DOM/Window 3 02.11.2010 09:39
Последние книги по JavaScript! monolithed Учебные материалы 7 26.10.2010 19:40
Выдвет ошибку JavaScript Ромио Opera, Safari и др. 4 21.10.2010 20:34