Я пытаюсь вызвать функцию контроллера из тега script в моем index.html.
<script>
var socket = io.connect('192.168.1.103:3000');
socket.emit('pusharduino', "SOCKET DATA FROM ANGULAR");
socket.on('pushangular', function (data) {
testFunction();
});
</script>
<button ng-controller="BaseCtrl" ng-click="testFunction()"></button>
Соединение socket.io работает нормально. Он подключается к моему серверу, и всякий раз, когда я испускаю что-либо в любом случае, он видит это просто отлично. Проблема "testFunction()" явно не определена.
Кнопка прямо под ней работает нормально! Функция testFunction() определена в контроллере BaseCtrl моего приложения. Очевидно, так как я привязал этот контроллер к кнопке, я могу вызвать функцию.
Вопрос в том; как я могу вызвать эту функцию из моего сценария socket.io? Или любой тег скрипта? Даже не нужно быть socket.io, а именно, что socket.io является триггером для этого конкретного события.
Я предполагаю, что это проблема с объемом области, и этот сценарий явно не имеет доступа к BaseCtrl. Я могу распечатать глобальные переменные, которые находятся в моем app.js.
THINGS I'S TRIED: - Прикрепление BaseCtrl к тегу скрипта. - Использование $ scope по всему месту. - Обращаясь к testFunction() всем, о чем я могу думать.
CODE FOR BaseCtrl
angular.module('yapp')
.controller('BaseCtrl', function($scope) {
$scope.testFunction = function() {
console.log("testFunction() has been called!);
}
});
(Tl; д - р)
В РЕЗЮМЕ: Как я могу сделать функцию в моем приложении доступной для моего html, чтобы всякий раз, когда socket.on('whatever')
запускается, эта функция будет вызвана? Меня не волнует, что функция на заводе, служба, контроллер, не имеет значения для меня. Мне просто нужно обновить кучу переменных в моем приложении, когда они получены с сервера через socket.io
В вашем скрипте вы можете сделать следующее
var parentScope = window.parent.angular.element(document.body).scope();
parentScope.$emit("MyEvent", { payload: "MyPayload"});
В вашем контроллере вы можете просто прослушать событие.
$scope.$on("MyEvent", function (evt, args) {
//arg is your payload
}
Надеюсь, это поможет.
var parentScope = window.parent.angular.element(window.frameElement).scope();