Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как вызвать метод? (https://javascript.ru/forum/misc/50168-kak-vyzvat-metod.html)

ibolgenos 15.09.2014 11:53

Как вызвать метод?
 
Здравствуйте. Помочите пожалуйста разобраться в том, как вызвать метод, который привязан к событию нажатия кнопки. Вроде звучит просто, но я не знаю как. С JS пришлось столкнуться только сейчас.

Есть дашборд (http://play.grafana.org/#/dashboard/...fana-play-home), на странице есть кнопка "Zoom out". Я хочу вызвать этот метод в другом месте, но увы не знаю как. Вот это место на странице:

<a class="small" ng-click="zoom(2)">Zoom Out</a>


Если в консоль ввести "zoom(2)", то получаю ошибку "ReferenceError: zoom is not defined". Как достучаться до этого метода?

skrudjmakdak 15.09.2014 12:44

Цитата:

Сообщение от ibolgenos (Сообщение 330639)
Помочите пожалуйста

:)
если там метод, то надо брать экзампляр класса:
var obj = {
fn: function (a) {
console.log(a)
}
};

obj.fn(2);

ibolgenos 15.09.2014 14:08

Ну с ООП мне все ясно, вот только вопрос остается открытым. Я не знаю как найти какому классу принадлежит "zoom()". Средства отладки да и сам JS отличается от других языков программирования, поэтому пока "затык". Сижу читаю учебник на сайте.

ibolgenos 16.09.2014 09:38

:help:

tsigel 16.09.2014 09:45

ibolgenos,
Вообще вам надо читать документацию дашборда с которым вы работаете, там наверняка это есть. Неохота мне туда лезть и смотреть как это делать, но если приперло можно симулировать клик по кнопке зума (костыль). Просто
document.querySelector("selector").click()

Цитата:

Если в консоль ввести "zoom(2)", то получаю ошибку "ReferenceError: zoom is not defined".
Похоже на магию :)

Можете скинуть ссылку на свою страницу?

ibolgenos 16.09.2014 10:21

Страница все так же - http://play.grafana.org/#/dashboard/...fana-play-home , кнопка ZOOM в самом верху.

Почитаю про document.querySelector("selector").click() , я так понимаю мне нужно ссылки ID какой нибудь присвоить и вписать вместо "selector"?

tsigel 16.09.2014 10:25

ibolgenos,
аааб это же ангулар! :) я "ng" не заметил. Функция должна лежать где-то в контроллере DashboardCtrl

Чтобы эмулировать клик надо написать
$(".navbar .grafana-menu-zoom-out .small").click();

ibolgenos 16.09.2014 10:45

tsigel, мне бы хотелось понять как вызвать метод который вызывается при клике. Клик у меня вышло кстати сделать и так как вы предложили выше, когда вместо selector написал класс кнопки :)

Не знаете как достучаться до метода zoom()? Мне бы хотелось понять принцип.

tsigel 16.09.2014 10:53

ibolgenos,
Принцип прост. Ангулар создает объект $scope для каждого контроллера (в данном случае "DashboardCtrl"), и привязывает этот объект к конкретной верстке (это тот элемент в котором написано "ng-controller='DashboardCtrl'"). Дальше если очень грубо (и не совсем так, но сама идея), то он при клике смотрит есть ли ng-click, если есть - то ищет $scope к которому он привязан, потом вызывает метод (или проигрывает выражение, не знаю как ещё называть) в контексте этого $scope. То есть в данном случае происходит вызов $scope.zoom(2). Чтобы вам делать вызовы этих методов - надо получить доступ к $scope этого элемента.

ibolgenos 16.09.2014 15:11

Не смог еще разобраться как это сделать, а вы знаете как это сделать? Или это требует детального изучения исходников?

Aetae 16.09.2014 15:19

Angular - это не js, это мерзость со своей говнопарадигмой.

tsigel 16.09.2014 15:24

ibolgenos,
Да, там надо ковыряться. Тем более что у вас там не просто angular, а angular с requirejs, и там могут быть применены нестандартные решения (хотя скрещивание ангулара с чем-либо уже нестандартное решение)

ibolgenos 17.09.2014 14:54

Я взял код примера («Add Some Control» angularjs.org/#add-some-control) с сайта AngularJS. Я хочу вызвать метод addTodo() используя консоль Chrome, но не знаю как. Если ввести консоль addTodo() или scope$.addTodo(), то получу сообщение «ReferenceError: addTodo is not defined». Поскольку я не программирую на JS и уж тем более не знаком с AngularJS, не могли бы вы сказать, что нужно ввести в консоль?

Вообще возможно ли вызвать метод в AngularJS со стороны? Или все методы вызвываються только внутри самого AngularJS?


tsigel 17.09.2014 15:02

Ничего) Ангулар не делает глобальных объектов (точнее делает, но добраться через них ОЧЕНЬ сложно). Он, как и любой фреймворк, рассчитан на управление его объектами через его апи. Из консоли вы этого не сделаете без костылей.

ibolgenos 17.09.2014 15:27

А вы можете добраться до функции addTodo() или сделать так, чтобы она стала доступна? Это вроде маленький пример с сайта AngularJS.

ibolgenos 17.09.2014 15:46

Вот тут сказали как вызвать функцию из примера - https://groups.google.com/forum/#!to...ar/6yoDLdYVRjc

Теперь осталось разобраться в своем...)

tsigel 17.09.2014 15:47

ibolgenos,
Вы не понимаете. Так делать НЕ НАДО. Разбирайтесь с фреймворком и делайте правильно. Если это вам понадобилось - значит что-то у вас не правильно сделано.

Самый простой способ сделать то что вы хотите - в контроллере после
.controller('TodoController', ['$scope', function($scope) {

написать
window.$scope = $scope;

тогда вызов addTodo():
$scope.addTodo();


Но это костыльный вызов. И после каждого такого вызова вы можете ловить неожиданные глюки, часть из которых может исправить вызов
$scope.$apply();

После каждого такого костыля.

Лучше изучить фреймворк чем наполнять его костылями.

ibolgenos 18.09.2014 09:54

Цитата:

Сообщение от tsigel (Сообщение 331013)
ibolgenos, Вы не понимаете. Так делать НЕ НАДО. Разбирайтесь с фреймворком и делайте правильно. Если это вам понадобилось - значит что-то у вас не правильно сделано.

Попробую поставить свою задачу по другому. У меня есть приложение на Java (использующее фреймворк Vaadin) и есть страница на JS (использующее фреймворк AngularJS). Я хочу чтобы мое приложение взаимодействовало с этой страницей.

Например, страницей будет являться главная страница AngularJS, на которой находиться пример, в котором при нажатии на кнопку появляется новый чекбокс. Так вот, я хочу чтобы чекбокс добавлялся и при нажатии на кнопку моего приложения. Как это сделать? Есть другие решения?

tsigel 18.09.2014 13:13

Эмулируйте действия пользователем (например как с кликом) или взаимодействуйте стейтами (через урл).

ibolgenos 18.09.2014 15:07

Разве эмулирование будет лучше? Особенно когда мне нужно не только кликнуть, но и заполнить некоторые поля.

Можете рассказать подробнее про "стейты", что за зверь? И если можно то попробуйте с помощью "стейта" кликнуть по кнопке, которая на официальном сайте AngularJS :)

tsigel 18.09.2014 15:32

А ваше взаимодействие с сайтом не должно влиять на его основную работу?

Стейты - это состояния сайта. грубо говоря страницы. Вам же наверно надо не просто кликнуть и поля заполнить? Наверно там много действий. Можно сделать состояния сайта удовлетворяющие вашим действиям и программой просто переключать их (меняя урл). Хотя в рамках нестандартных задач часто приходится пользовать нестандартные решения, и возможно вы и правы. Тогда лучше чем через angular.element ничего наверно не придумать. Но как я уже говорил вы можете ловить неожиданные глюки. Дело в том что любое событие и метод должен вызываться через $apply, в котором ангулар просматривает состояние объекта и применяет изменения в доме и т.п. Если действовать без $apply может не перестраиваться дом, а если вызывать его слишком часто - скрипт может вылететь с ошибкой.

melky 19.09.2014 22:35

Цитата:

Сообщение от Aetae (Сообщение 330866)
Angular - это не js, это мерзость со своей говнопарадигмой.

критикуя - предлагай. что использовать взамен NG ? спрашиваю из-за незнания

Aetae 20.09.2014 00:04

Цитата:

Сообщение от melky (Сообщение 331461)
критикуя - предлагай. что использовать взамен NG ? спрашиваю из-за незнания

Былоб что предлагать... Все мы едим кактусы, те или иные.:(


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