Вызов функции angularjs с использованием jquery/javascript

Я пытаюсь вызвать функцию angular с помощью javascript/jQuery, следующая ссылка, которую я нашел

Я предпринял те же шаги, но получил ошибку в консоли браузера.

Uncaught TypeError: Cannot call method 'myfunction' of undefined

Я создал fiddle. Как вызывать функцию myfunction и предупреждение? Любая идея?

Ответ 1

Решение в вопросах, которые вы связываете, является правильным. Проблема с вашей реализацией заключается в том, что вы не указали элемент ID правильно.

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

HTML

<div id="YourElementId" ng-app='MyModule' ng-controller="MyController">
    Hi
</div>

Код JS

angular.module('MyModule', [])
    .controller('MyController', function ($scope) {
    $scope.myfunction = function (data) {
        alert("---" + data);
    };
});

window.onload = function () {
    angular.element(document.getElementById('YourElementId')).scope().myfunction('test');
}

DEMO

Ответ 2

Вы можете использовать следующее:

angular.element(domElement).scope(), чтобы получить текущую область для элемента

angular.element(domElement).injector(), чтобы получить текущий инжектор приложения

angular.element(domElement).controller(), чтобы удержать экземпляр ng-controller.

Надеюсь, что это поможет

Ответ 3

Другой способ - создать функции в глобальной области. Это было необходимо для меня, так как в Angular 1.5 не удалось достичь области видимости компонента.

Пример:

angular.module("app", []).component("component", {
  controller: ["$window", function($window) {
    var self = this;
    
    self.logg = function() {
      console.log("logging!");
    };
    
    $window.angularControllerLogg = self.logg;
  }
});
               
window.angularControllerLogg();

Ответ 4

Ваш плункер стреляет

angular.element(document.getElementById('MyController')).scope().myfunction('test');

Прежде чем что-либо будет показано.

Вы можете проверить, что, завернув его в тайм-аут

setTimeout(function() {
   angular.element(document.getElementById('MyController')).scope().myfunction('test');    
}, 1000);

Вам также необходимо добавить идентификатор в свой div.

<div ng-app='MyModule' ng-controller="MyController" id="MyController">

Ответ 5

Не нужно давать идентификатор для контроллера. Это можно просто назвать следующим

angular.element(document.querySelector('[ng-controller="HeaderCtrl"]')).scope().myFunc()

Здесь HeaderCtrl - имя контроллера, определенное в вашем JS

Ответ 6

Пожалуйста, проверьте этот ответ

       // In angularJS script
        $scope.foo = function() {
            console.log('test');
        };
        $window.angFoo = function() {
            $scope.foo();
            $scope.$apply(); 
        };

        // In jQuery
        if (window.angFoo) {
            window.angFoo();
        }

Ответ 7

Попробуй это:

const scope = angular.element(document.getElementById('YourElementId')).scope();
scope.$apply(function(){
     scope.myfunction('test');
});