Как вызвать метод?
Здравствуйте. Помочите пожалуйста разобраться в том, как вызвать метод, который привязан к событию нажатия кнопки. Вроде звучит просто, но я не знаю как. С 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". Как достучаться до этого метода? |
Цитата:
если там метод, то надо брать экзампляр класса: var obj = { fn: function (a) { console.log(a) } }; obj.fn(2); |
Ну с ООП мне все ясно, вот только вопрос остается открытым. Я не знаю как найти какому классу принадлежит "zoom()". Средства отладки да и сам JS отличается от других языков программирования, поэтому пока "затык". Сижу читаю учебник на сайте.
|
:help:
|
ibolgenos,
Вообще вам надо читать документацию дашборда с которым вы работаете, там наверняка это есть. Неохота мне туда лезть и смотреть как это делать, но если приперло можно симулировать клик по кнопке зума (костыль). Просто document.querySelector("selector").click() Цитата:
Можете скинуть ссылку на свою страницу? |
Страница все так же - http://play.grafana.org/#/dashboard/...fana-play-home , кнопка ZOOM в самом верху.
Почитаю про document.querySelector("selector").click() , я так понимаю мне нужно ссылки ID какой нибудь присвоить и вписать вместо "selector"? |
ibolgenos,
аааб это же ангулар! :) я "ng" не заметил. Функция должна лежать где-то в контроллере DashboardCtrl Чтобы эмулировать клик надо написать $(".navbar .grafana-menu-zoom-out .small").click(); |
tsigel, мне бы хотелось понять как вызвать метод который вызывается при клике. Клик у меня вышло кстати сделать и так как вы предложили выше, когда вместо selector написал класс кнопки :)
Не знаете как достучаться до метода zoom()? Мне бы хотелось понять принцип. |
ibolgenos,
Принцип прост. Ангулар создает объект $scope для каждого контроллера (в данном случае "DashboardCtrl"), и привязывает этот объект к конкретной верстке (это тот элемент в котором написано "ng-controller='DashboardCtrl'"). Дальше если очень грубо (и не совсем так, но сама идея), то он при клике смотрит есть ли ng-click, если есть - то ищет $scope к которому он привязан, потом вызывает метод (или проигрывает выражение, не знаю как ещё называть) в контексте этого $scope. То есть в данном случае происходит вызов $scope.zoom(2). Чтобы вам делать вызовы этих методов - надо получить доступ к $scope этого элемента. |
Не смог еще разобраться как это сделать, а вы знаете как это сделать? Или это требует детального изучения исходников?
|
Angular - это не js, это мерзость со своей говнопарадигмой.
|
ibolgenos,
Да, там надо ковыряться. Тем более что у вас там не просто angular, а angular с requirejs, и там могут быть применены нестандартные решения (хотя скрещивание ангулара с чем-либо уже нестандартное решение) |
Я взял код примера («Add Some Control» angularjs.org/#add-some-control) с сайта AngularJS. Я хочу вызвать метод addTodo() используя консоль Chrome, но не знаю как. Если ввести консоль addTodo() или scope$.addTodo(), то получу сообщение «ReferenceError: addTodo is not defined». Поскольку я не программирую на JS и уж тем более не знаком с AngularJS, не могли бы вы сказать, что нужно ввести в консоль?
Вообще возможно ли вызвать метод в AngularJS со стороны? Или все методы вызвываються только внутри самого AngularJS? ![]() |
Ничего) Ангулар не делает глобальных объектов (точнее делает, но добраться через них ОЧЕНЬ сложно). Он, как и любой фреймворк, рассчитан на управление его объектами через его апи. Из консоли вы этого не сделаете без костылей.
|
А вы можете добраться до функции addTodo() или сделать так, чтобы она стала доступна? Это вроде маленький пример с сайта AngularJS.
|
Вот тут сказали как вызвать функцию из примера - https://groups.google.com/forum/#!to...ar/6yoDLdYVRjc
Теперь осталось разобраться в своем...) |
ibolgenos,
Вы не понимаете. Так делать НЕ НАДО. Разбирайтесь с фреймворком и делайте правильно. Если это вам понадобилось - значит что-то у вас не правильно сделано. Самый простой способ сделать то что вы хотите - в контроллере после .controller('TodoController', ['$scope', function($scope) { написать window.$scope = $scope; тогда вызов addTodo(): $scope.addTodo(); Но это костыльный вызов. И после каждого такого вызова вы можете ловить неожиданные глюки, часть из которых может исправить вызов $scope.$apply(); После каждого такого костыля. Лучше изучить фреймворк чем наполнять его костылями. |
Цитата:
Например, страницей будет являться главная страница AngularJS, на которой находиться пример, в котором при нажатии на кнопку появляется новый чекбокс. Так вот, я хочу чтобы чекбокс добавлялся и при нажатии на кнопку моего приложения. Как это сделать? Есть другие решения? |
Эмулируйте действия пользователем (например как с кликом) или взаимодействуйте стейтами (через урл).
|
Разве эмулирование будет лучше? Особенно когда мне нужно не только кликнуть, но и заполнить некоторые поля.
Можете рассказать подробнее про "стейты", что за зверь? И если можно то попробуйте с помощью "стейта" кликнуть по кнопке, которая на официальном сайте AngularJS :) |
А ваше взаимодействие с сайтом не должно влиять на его основную работу?
Стейты - это состояния сайта. грубо говоря страницы. Вам же наверно надо не просто кликнуть и поля заполнить? Наверно там много действий. Можно сделать состояния сайта удовлетворяющие вашим действиям и программой просто переключать их (меняя урл). Хотя в рамках нестандартных задач часто приходится пользовать нестандартные решения, и возможно вы и правы. Тогда лучше чем через angular.element ничего наверно не придумать. Но как я уже говорил вы можете ловить неожиданные глюки. Дело в том что любое событие и метод должен вызываться через $apply, в котором ангулар просматривает состояние объекта и применяет изменения в доме и т.п. Если действовать без $apply может не перестраиваться дом, а если вызывать его слишком часто - скрипт может вылететь с ошибкой. |
Цитата:
|
Цитата:
|
Часовой пояс GMT +3, время: 19:58. |