【问题标题】:Angular / Socket.io / HTML / Calling a Controller's Function from WITHIN <script> in HTMLAngular / Socket.io / HTML / 从 HTML 中的 WITHIN <script> 调用控制器的函数
【发布时间】:2015-09-22 19:47:20
【问题描述】:

我正在尝试从 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 中的全局变量。

我尝试过的事情: - 将 BaseCtrl 附加到脚本标签。 - 到处使用 $scope。 - 以我能想到的各种方式引用 testFunction()。

BaseCtrl 代码

angular.module('yapp')
 .controller('BaseCtrl', function($scope) {

   $scope.testFunction = function() {
     console.log("testFunction() has been called!);
   }

});

----------------------------------------------- -----------------------------------------

(tl;dr)

摘要: 如何使我的应用程序中的函数可用于我的 html,以便每当触发 socket.on('whatever') 时,都会调用该函数?我不在乎功能是否在工厂、服务、控制器中,对我来说并不重要。每当通过 socket.io 从服务器接收到变量时,我只需要更新我的应用程序中的一堆变量

【问题讨论】:

  • 将其移至服务。就那么简单。你已经在你的问题中暗示了这一点。
  • 感谢您的反对...我问这个的原因是因为我是这一切的初学者,并不真正了解我在做什么。我暗示我可以将其移至服务,因为我认为有人可能会这么说,但我不明白该怎么做。我几乎不明白自己的问题。
  • 谢谢凯文,我会通读的。不过我必须问;甚至可以从 HTML 脚本标签中调用该函数吗?另外,当您说将其移至服务时,您是指需要调用的函数,还是指 socket.io 连接本身?我尝试调用工厂中的一个函数,但也没有用。我不确定如何使该脚本可以使用服务/工厂。
  • 只是 socket.io 部分,该函数将是您作为服务(或工厂,但是您定义它)​​的回调提供的东西,该函数在控制器或其模板之外无法访问。

标签: javascript html angularjs function socket.io


【解决方案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
}

希望对您有所帮助。

【讨论】:

  • 天哪,它成功了!!!这正是我所需要的。我需要做一些研究才能真正了解这里发生了什么,但我很高兴你让它发挥作用。我还将继续沿着@Kevin B 为我设定的道路前进,因为它看起来是最流行的方法(将 socketio 放入服务中),但就这个问题而言,这就是我正在寻找的答案。谢谢!
  • 我同意将其作为一项服务是有意义的。当您需要 Angular 之外的东西与 Angular 进行通信时,这是一个巧妙的技巧,可以放在后袋中。例如,您可以在需要与父框架(Angular 应用程序)进行通信的 iFrame 中使用此技术。唯一的区别是您需要将定义范围的行更改为:var parentScope = window.parent.angular.element(window.frameElement).scope();
猜你喜欢
  • 2018-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多