在AngularJS中,当自定义服务注入到不同的模块时,未知的提供商
Unknown Provider in AngularJS when Injecting custom service into different module
我对AngularJS相当陌生,一直在尝试创建一个封装套接字的服务。网络沙盒应用程序的IO。
我在一个单独的文件中创建了一个'NetworkServices'模块:
(function(){
var app = angular.module('NetworkServices', []);
app.factory('$socket', ['', function(){
var Socket = {
ip: '127.0.0.1',
port: '8080',
socket: null,
Connect: function(ip, port, sock){
Socket.ip = ip;
Socket.port = port;
Socket.log('Connecting to ' + Socket.ip + ':' + Socket.port);
Socket.socket = window.io.connect(Socket.ip + ':' + Socket.port);
sock = Socket.socket;
}
};
return Socket;
}]);
})();
下面是我想要注入服务的模块:
(function(){
var app = angular.module('server', ['ui.bootstrap', 'NetworkServices']);
app.controller('ServerCtrl',['$scope','$socket', function ($scope, $socket) {
var val = $scope;
val.test = true;
var self = this;
self.isCollapsed = false;
self.ip = '129.119.228.206';
self.port = '8080';
self.socket = {};
self.Connect = function(){
$socket.Connect(self.ip, self.port, self.socket);
};
}]);
app.directive('server', function(){
return {
restrict: 'E',
templateUrl: 'views/server.html',
controller: 'ServerCtrl',
controllerAs: 'server'
};
});
})();
当我添加$socket服务到服务器模块,我得到以下错误:
Error: [$injector:unpr] Unknown provider: Provider <- <- $socket
我已经添加了"NetworkServices"模块作为一个依赖于"服务器"模块,但我不能告诉为什么我不能访问$socket服务?有什么建议吗?
问题不在于注入$socket服务,而在于创建它。在它的定义中,你定义了一个angular无法创建的依赖项。
app.factory('$socket', ['', function(){...
应:app.factory('$socket', function(){...
作为angular的新手,请注意,在你自己的服务之前使用'$'前缀是不好的做法,因为它是为angular的内部组件和变量保留的。关于从工厂定义中删除空字符串的另一个答案是准确的。在工厂定义周围包含方括号的原因是为了使其最小化是安全的。下面是定义工厂的3种主要方法:
非最小化安全版本
app.factory('Socket', function ($log, $window) {
function Socket(ip, port, socket) {
this.ip = '127.0.0.1';
this.port = '8080';
this.socket: null;
}
Socket.prototype.connect = function (ip, port, sock){
$log('Connecting to ' + Socket.ip + ':' + Socket.port);
this.socket = $window.io.connect(Socket.ip + ':' + Socket.port);
return this.socket;
}
return Socket;
});
这是最小安全的方括号版本:
app.factory('Socket', ['$log', '$window', function ($log, $window) {
function Socket(ip, port, socket) {
this.ip = '127.0.0.1';
this.port = '8080';
this.socket: null;
}
Socket.prototype.connect = function (ip, port, sock){
$log('Connecting to ' + Socket.ip + ':' + Socket.port);
this.socket = $window.io.connect(Socket.ip + ':' + Socket.port);
return this.socket;
}
return Socket;
}]);
这是我最喜欢的最小安全版本(angular在他们的源代码中是这样做的):
socketFactory.$inject = ['$log', '$window'];
function socketFactory($log, $window) {
function Socket(ip, port, socket) {
this.ip = '127.0.0.1';
this.port = '8080';
this.socket: null;
}
Socket.prototype.connect = function (ip, port, sock){
$log('Connecting to ' + Socket.ip + ':' + Socket.port);
this.socket = $window.io.connect(Socket.ip + ':' + Socket.port);
return this.socket;
}
return Socket;
}
app.factory('Socket', socketFactory);
现在控制器就简单多了。
app.controller('ServerCtrl',['Socket', function (Socket) {
this.socketConfig = new Socket('129.119.228.206', '8080'),
this.socket = socketConfig.connect();
}]);
相关文章:
- AWS Cognito:通过 google 获取“请提供有效的公共提供商”
- 角度模态服务未知提供商
- 选择下拉列表需要在选中时显示提供商的详细信息-无法通过我的脚本显示url
- 从服务提供商 IP 地址获取设备 IP 地址
- JsFiddle:未知提供商:$intervalProvider <- $interval
- 工厂和控制器,未知提供商
- 未知提供商:$resourceProvider - AngularJS
- 未知提供商:捆绑后$resourceProvider
- ES2015 单例或服务提供商或模块,用于敲除.js组件
- $http提供商向 Github API 发出外部请求,但不向 Google 地图 API 发出请求
- Angular Js:工厂、服务和提供商.何时使用哪个
- AngularJS + RequireJS.未知提供商:$routeProvider
- 为什么我必须添加尾部'提供商'到服务名称,当我使用es6时
- Chrome中阻止的视频-运行视频提供商的不安全内容
- 如何在AngularJs中设置来自其提供商的服务的依赖关系
- 单个<提供商>用于许多组件
- 在AngularJS中,当自定义服务注入到不同的模块时,未知的提供商
- AngularJS为什么我不能与另一个模块共享一个提供商?
- Angularjs、Typescript、Uglify实例化myApp模块失败未知提供商:a
- Angular:在模块's的config/run中混合了提供商和自定义服务