¿Cómo puedo llamar a la función definida bajo el controlador desde cualquier lugar de la página web (fuera del componente del controlador)?
Funciona perfectamente cuando presiono el botón "obtener". Pero necesito llamarlo desde fuera del controlador div. La lógica es: por defecto, mi div está oculto. En algún lugar del menú de navegación presiono un botón y debería mostrar () mi div y ejecutar la función "get". ¿Cómo puedo lograr esto?
Mi página web es:
<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>
Mi 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 desde otro controlador?Respuestas:
Aquí hay una manera de llamar a la función del controlador desde afuera:
donde
get()
es una función de su controlador.Puedes cambiar
a
Si está utilizando jQuery.
Además, si su función significa cambiar algo en su Vista, debe llamar
para aplicar los cambios.
Una cosa más, debe tener en cuenta es que los ámbitos se inicializan después de cargar la página, por lo que los métodos de llamada desde fuera del alcance siempre deben realizarse después de cargar la página. De lo contrario, no llegará al alcance en absoluto.
ACTUALIZAR:
Con las últimas versiones de angular, debe usar
Y sí, esta es, de hecho, una mala práctica , pero a veces solo necesitas hacer las cosas rápido y sucio.
fuente
$apply
pieza funcionara para mí, hasta que envolví el código en una función, por ejemplo..scope.$apply(function() { scope.get() });
angular.element(document.getElementById('yourControllerElementID')).scope().controller;
Por ej. if use:angular.element(document.getElementById('controller')).scope().get()
throws y error indefinido, pero si lo usoangular.element(document.getElementById('controller')).scope().controller.get()
funciona.scope()
en elangular.element(...)
, porque devuelve indefinido y un vardump del elemento / objeto angular dice que la funciónscope
se encuentra dentro del objeto__proto__
.He encontrado un ejemplo en internet.
Algún tipo escribió este código y funcionó perfectamente
HTML
JAVASCRIPT
Manifestación
* Hice algunas modificaciones, ver original: fuente JSfiddle
fuente
La solución
angular.element(document.getElementById('ID')).scope().get()
dejó de funcionar para mí en angular 1.5.2. Sombody menciona en un comentario que esto tampoco funciona en 1.4.9. Lo arreglé almacenando el alcance en una variable global:llamar desde código personalizado:
si desea restringir el alcance solo a este método. Para minimizar la exposición de todo el alcance. use la siguiente técnica.
llamar desde código personalizado:
fuente
La respuesta de Dmitry funciona bien. Acabo de hacer un ejemplo simple usando la misma técnica.
jsfiddle: http://jsfiddle.net/o895a8n8/5/
.
fuente
Prefiero incluir la fábrica como dependencias de los controladores que inyectarles su propia línea de código: http://jsfiddle.net/XqDxG/550/
ControllerZero. $ Inject = ['$ scope', 'mySharedService'];fuente
Puede valer la pena considerar si tener su menú sin ningún alcance asociado es el camino correcto. No es realmente la forma angular.
Pero, si es el camino que debe seguir, puede hacerlo agregando las funciones a $ rootScope y luego dentro de esas funciones usando $ broadcast para enviar eventos. su controlador luego usa $ on para escuchar esos eventos.
Otra cosa a tener en cuenta si termina teniendo su menú sin alcance es que si tiene varias rutas, entonces todos sus controladores tendrán que tener su propio upate y obtener funciones. (esto supone que tiene varios controladores)
fuente
Solía trabajar con $ http, cuando quiero obtener información de un recurso hago lo siguiente:
Y el código en el controlador:
Envío al servicio qué función debo llamar en el controlador
fuente
Tengo múltiples rutas y múltiples controladores, por lo que no pude obtener la respuesta aceptada para trabajar. Descubrí que agregar la función a la ventana funciona:
Luego, fuera del controlador, esto se puede hacer:
fuente
Llame a la función de alcance angular desde fuera del controlador.
fuente
Soy un usuario de Ionic Framework y el que encontré que siempre proporcionaría el $ scope del controlador actual es:
angular.element(document.querySelector('ion-view[nav-view="active"]')).scope()
Sospecho que esto se puede modificar para adaptarse a la mayoría de los escenarios, independientemente del marco (o no) al encontrar la consulta que se dirigirá a los elementos DOM específicos que están disponibles solo durante una instancia de controlador determinada.
fuente