【发布时间】:2015-03-18 20:01:50
【问题描述】:
我有一个两部分的问题:
I. --- 当我在 requirejs 路径文件中加载 socket.io 时,虽然它可能出现在浏览器的脚本集合中,但当我在工厂对象中使用它时,我收到错误, "io" 未定义。但是,如果我直接从 HTML 页面加载 socket.io.js,我不会收到错误消息。 我找到了another person had the exact issue here,但没有找到解决方案。
II. --- 我正在使用 ocLazyLoad,我的应用程序是按功能模块化的。我选择将我从 Brian Ford's example 复制的 $socket factory 对象直接放在我的根模块 ['app'] 中。我知道每次使用延迟加载场景中的服务时都需要加载它们,而不管之前对它们的调用如何。但是,这似乎是错误的。如果我想让我的应用程序实时,这意味着我必须将它列为每个州的依赖项。应该有更有效的方法来做到这一点,但我看不出如何。
问题一:
-
建立 RequireJs 依赖并添加到 bootstrap
一个。 RequireJs的路径文件:
//socket.io 'socket.io' : '/vendor/socket.io-client/lib/socket.io' //shim 'socketio': {exports: 'io'}b.引导文件
window.name = "NG_DEFER_BOOTSTRAP!"; define([ 'require', 'jquery', 'socket.io', 'angular', .....观察:这一切都按预期工作,socket.io.js 现在在我的浏览器的页面加载脚本集合中证明了这一点。
-
$socket 工厂服务
一个。 app.socket.js(来自 Brian Ford 的工厂文件)文件:
define(['app'], function (app) { app.factory('$socket',['$rootScope', function ($rootScope) { ///////////////////// // PROBLEM IS HERE // ///////////////////// var socket = io.connect(); return { on: function (eventName, callback) { socket.on(eventName, function () { var args = arguments; $rootScope.$apply(function () { callback.apply(socket, args); }); }); }, emit: function (eventName, data, callback) { socket.emit(eventName, data, function () { var args = arguments; $rootScope.$apply(function () { if (callback) { callback.apply(socket, args); } }); }) } }; }]); });
b.使用 $socket 工厂的控制器
define(['angular'], function(ng) { 'use strict'; /* @ngInject */ MyDashboardCtrl.$inject = ['$socket','MyDashboardSvc']; ng.module('MyDashboard').controller('MyDashboardCtrl', MyDashboardCtrl); function MyDashboardCtrl($socket, MyDashboardSvc) { ....
观察:从 require 的路径文件加载 socket.io.js 后,一旦控制器将工厂作为依赖项调用,我就会收到此错误:
ReferenceError: io is not defined
如果我直接从 HTML 加载 socket.io.js,问题就会消失:
<script src="vendor/socket.io-client/lib/socket.io.js"></script> <script src="app/require/rconfig.js"></script> <script src="vendor/requirejs/require.js" data-main="app/app.bootstrap.js"></script>
问题二:
我想让我的整个应用程序实时化。这是否意味着,如果我打算使用延迟加载,我需要在每个 BLESSED $state 中列出 $socket 工厂?
【问题讨论】:
标签: angularjs socket.io requirejs