Как я могу вызвать функцию, определенную под контроллером, из любого места веб-страницы (вне компонента контроллера)?
Он отлично работает, когда я нажимаю кнопку «получить». Но мне нужно позвонить со стороны контроллера div. Логика такова: по умолчанию мой div скрыт. Где-то в меню навигации я нажимаю кнопку, и она должна показать () мой div и выполнить функцию «get». Как мне этого добиться?
Моя веб-страница:
<div ng-controller="MyController">
<input type="text" ng-model="data.firstname" required>
<input type='text' ng-model="data.lastname" required>
<form ng-submit="update()"><input type="submit" value="update"></form>
<form ng-submit="get()"><input type="submit" value="get"></form>
</div>
Мой JS:
function MyController($scope) {
// default data and structure
$scope.data = {
"firstname" : "Nicolas",
"lastname" : "Cage"
};
$scope.get = function() {
$.ajax({
url: "/php/get_data.php?",
type: "POST",
timeout: 10000, // 10 seconds for getting result, otherwise error.
error:function() { alert("Temporary error. Please try again...");},
complete: function(){ $.unblockUI();},
beforeSend: function(){ $.blockUI()},
success: function(data){
json_answer = eval('(' + data + ')');
if (json_answer){
$scope.$apply(function () {
$scope.data = json_answer;
});
}
}
});
};
$scope.update = function() {
$.ajax({
url: "/php/update_data.php?",
type: "POST",
data: $scope.data,
timeout: 10000, // 10 seconds for getting result, otherwise error.
error:function() { alert("Temporary error. Please try again...");},
complete: function(){ $.unblockUI();},
beforeSend: function(){ $.blockUI()},
success: function(data){ }
});
};
}
get()
MyController из другого контроллера?Ответы:
Вот способ вызвать функцию контроллера извне:
где
get()
функция от вашего контроллера.Вы можете переключиться
в
Если вы используете JQuery.
Кроме того, если ваша функция означает что-то изменить в вашем представлении, вы должны вызвать
применить изменения.
Еще одна вещь, которую вы должны заметить, это то, что области инициализируются после загрузки страницы, поэтому вызов методов из-за пределов области всегда должен выполняться после загрузки страницы. Иначе вы вообще не попадете в сферу.
ОБНОВИТЬ:
С последними версиями угловых вы должны использовать
И да, это на самом деле плохая практика , но иногда вам просто нужно сделать что-то быстрое и грязное.
источник
$apply
часть работать на меня, пока я не обернул код в функцию, например..scope.$apply(function() { scope.get() });
angular.element(document.getElementById('yourControllerElementID')).scope().controller;
For ex. Если использовать:angular.element(document.getElementById('controller')).scope().get()
бросает и неопределенная ошибка, но если я используюangular.element(document.getElementById('controller')).scope().controller.get()
это работает.scope()
вangular.element(...)
, потому что он возвращает неопределенное и vardump углового элемента / объекта говорит, что функцияscope
находится внутри__proto__
-объекта.Я нашел пример в интернете.
Какой-то парень написал этот код и работал отлично
HTML
JAVASCRIPT
демонстрация
* Я сделал некоторые модификации, см. Оригинал: шрифт JSfiddle
источник
Решение
angular.element(document.getElementById('ID')).scope().get()
у меня перестало работать в angular 1.5.2. Кто-то упомянул в комментарии, что это не работает и в 1.4.9. Я исправил это, сохранив область видимости в глобальной переменной:звонок из пользовательского кода:
если вы хотите ограничить область действия только этим методом. Чтобы минимизировать воздействие всего объема. используйте следующую технику.
звонок из пользовательского кода:
источник
Дмитрий отвечает отлично. Я просто сделал простой пример, используя ту же технику.
jsfiddle: http://jsfiddle.net/o895a8n8/5/
,
источник
Я бы предпочел включить фабрику в качестве зависимостей от контроллеров, чем вводить их с собственной строкой кода: http://jsfiddle.net/XqDxG/550/
ControllerZero. $ Inject = ['$ scope', 'mySharedService'];источник
Возможно, стоит подумать, если ваше меню без какой-либо связанной области является правильным способом. Это не совсем угловой путь.
Но, если вам нужно идти по этому пути, вы можете сделать это, добавив функции в $ rootScope, а затем в эти функции, используя $ broadcast для отправки событий. Затем ваш контроллер использует $ on для прослушивания этих событий.
Еще одна вещь, которую стоит учесть, если вы в конечном итоге получите свое меню без области действия, это то, что если у вас есть несколько маршрутов, то все ваши контроллеры должны будут иметь свои собственные функции обновления и получения. (это предполагает, что у вас есть несколько контроллеров)
источник
Я использую для работы с $ http, когда хочу получить некоторую информацию из ресурса, я делаю следующее:
И код в контроллере:
Отправляю в сервис какую функцию должны вызывать в контроллере
источник
У меня есть несколько маршрутов и несколько контроллеров, поэтому я не смог получить принятый ответ для работы. Я обнаружил, что добавление функции в окно работает:
Тогда вне контроллера это можно сделать:
источник
Вызовите функцию Angular Scope снаружи контроллера.
источник
Я - пользователь Ionic Framework, и я обнаружил, что он будет постоянно предоставлять область $ текущего контроллера:
angular.element(document.querySelector('ion-view[nav-view="active"]')).scope()
Я подозреваю, что это может быть изменено, чтобы соответствовать большинству сценариев независимо от структуры (или нет), находя запрос, который будет нацелен на определенные элементы DOM, которые доступны только во время данного экземпляра контроллера.
источник