Angular / Socket.io / HTML / Вызов функции контроллера из WITHIN <script> в HTML

0

Я пытаюсь вызвать функцию контроллера из тега 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

  • 0
    переместить его в службу. просто как тот. Вы уже намекали на это в своем вопросе.
  • 1
    Спасибо за отрицательное голосование ... причина, по которой я это спрашиваю, в том, что я начинающий во всем этом и не очень понимаю, что я делаю. Я намекнул, что могу перенести это на службу, потому что думал, что кто-то скажет это, но я не понимаю, как это сделать. Я едва понимаю свой вопрос.
Показать ещё 5 комментариев
Теги:
function
socket.io

1 ответ

1
Лучший ответ

В вашем скрипте вы можете сделать следующее

var parentScope = window.parent.angular.element(document.body).scope();
parentScope.$emit("MyEvent", { payload: "MyPayload"});

В вашем контроллере вы можете просто прослушать событие.

$scope.$on("MyEvent", function (evt, args) {
//arg is your payload
}

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

  • 1
    Святой Молли, это сработало !!! Это именно то, что мне было нужно. Мне нужно будет провести некоторое исследование, чтобы по-настоящему понять, что здесь происходит, но я очень рад, что вы заставили его работать. Я также буду продолжать идти по пути, который установил @Kevin B, поскольку он выглядит как самый популярный метод (добавление socketio в службу), но, насколько этот вопрос идет, ЭТО - ответ, который я искал. Спасибо!
  • 1
    Я бы согласился сделать это сервисом. Это ловкий трюк в заднем кармане, когда вам нужно что-то вне угла, чтобы общаться с углом. Например, вы можете использовать эту технику в iFrames, которые должны общаться с родительским фреймом (приложение Angular). Разница лишь в том, что вам нужно изменить строку, где вы определяете область видимости, следующим образом: var parentScope = window.parent.angular.element(window.frameElement).scope();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню