这篇文章主要围绕angularjs–初始化非注入角度服务和angularjs初始化的方法展开,旨在为您提供一份详细的参考资料。我们将全面介绍angularjs–初始化非注入角度服务的优缺点,解答ang
这篇文章主要围绕angularjs – 初始化非注入角度服务和angularjs初始化的方法展开,旨在为您提供一份详细的参考资料。我们将全面介绍angularjs – 初始化非注入角度服务的优缺点,解答angularjs初始化的方法的相关问题,同时也会为您带来Angular NgUpgrade将AngularJS服务注入Angular服务;获取:未处理的Promise拒绝:无法读取未定义的属性’get’;区:、angularjs – Angular ng-init:’通过服务器端脚本注入数据’、angularjs – SignalR客户端方法在角度服务中多次发射、angularjs – 为什么我的角度服务值没有更新我的范围?的实用方法。
本文目录一览:- angularjs – 初始化非注入角度服务(angularjs初始化的方法)
- Angular NgUpgrade将AngularJS服务注入Angular服务;获取:未处理的Promise拒绝:无法读取未定义的属性’get’;区:
- angularjs – Angular ng-init:’通过服务器端脚本注入数据’
- angularjs – SignalR客户端方法在角度服务中多次发射
- angularjs – 为什么我的角度服务值没有更新我的范围?
angularjs – 初始化非注入角度服务(angularjs初始化的方法)
此服务不会在应用程序中的任何位置注入,因此不会初始化.
要解决这个问题,我们只是注入它而不是在另一个服务中使用它,只是为了让它“新手”.
有没有办法初始化服务而不必将其注入其他服务/控制器/指令?
解决方法
angular.module(...).run(['myService',function(myService) { myService.init(); }]);
如果服务初始化代码放在服务构造函数中,即:
angular.module(...).service(function() { ...initialization code... });
…然后只需在run()方法中声明对服务的依赖就足够了,即:
angular.module(...).run(['myService',function() { // nothing else needed; the `myService` constructor,containing the // initialization code,will already have run at this point }]);
实际上,您可以将其缩写如下:
angular.module(...).run(['myService',angular.noop]);
(旁注:我发现这种模式有点尴尬;如果服务只包含初始化代码,只需在run()函数中直接实现初始化代码.无论如何,你可以将多个run()函数附加到每个模块.)
Angular NgUpgrade将AngularJS服务注入Angular服务;获取:未处理的Promise拒绝:无法读取未定义的属性’get’;区:
什么是INSANELY奇怪的是我可以在Angular COMPONENT中使用此服务但由于某种原因无法在Angular SERVICE中使用它.
app.js
import UserService from './user.service'; angular.module('app',[]) .service('UserService',UserService) .config(/* config */) .run(/* run */); import './ng2app.module';
ng2app.module.ts:
import { browserModule } from '@angular/platform-browser'; import { UpgradeModule } from '@angular/upgrade/static'; import { platformbrowserDynamic } from '@angular/platform-browser-dynamic'; @NgModule({ imports: [ browserModule,UpgradeModule,],declarations: [],entryComponents: [],providers: [ // angularJS service: { provide: 'UserService',useFactory: (i: any) => i.get('UserService'),// <---- this is the line all the errors point to. deps: ['$injector'] },] }) export default class Ng2AppModule { constructor(){} } platformbrowserDynamic() .bootstrapModule(Ng2AppModule) .then(platformRef => { const upgrade = platformRef.injector.get(UpgradeModule) as UpgradeModule; upgrade.bootstrap(document.documentElement,['app'],{strictDi: true}); });
后来…在服务中(失败):
import {Injectable,Inject} from "@angular/core"; import UserService from 'app/login/user.service'; @Injectable() export class AnAngularservice{ constructor( // causes the error if I uncomment it wtf: <-------------- // @Inject('UserService') private userService: UserService ){} }
稍后……在一个组件中(正常工作):
import { Component } from '@angular/core'; import {Inject} from "@angular/core"; import UserService from 'app/login/user.service'; import template from 'tmpl.html'; @Component({ selector: 'an-angular-component',template,}) export class AnAngularComponent{ constructor( @Inject('UserService') private userService: UserService ){ console.log(userService) // works just fine. wtf <-------------- } }
有谁知道为什么会这样,以及如何解决它?
This question is almost exactly the same thing but for some reason it didnt work
AngularJS版本:1.5.8
角/核心等版本:4.2.4
Here’s a link to the Github issue I opened in the Angular repo
堆栈跟踪:
zone.js:522 Unhandled Promise rejection: Cannot read property 'get' of undefined ; Zone: <root> ; Task: Promise.then ; Value: TypeError: Cannot read property 'get' of undefined at useFactory (ng2app.module.ts:114) at _callFactory (core.es5.js:9604) at _createProviderInstance$1 (core.es5.js:9547) at initNgModule (core.es5.js:9498) at new NgModuleRef_ (core.es5.js:10606) at createNgModuleRef (core.es5.js:10590) at Object.debugCreateNgModuleRef [as createNgModuleRef] (core.es5.js:12874) at NgModuleFactory_.create (core.es5.js:13869) at core.es5.js:4556 at ZoneDelegate.invoke (zone.js:334) at Object.onInvoke (core.es5.js:3933) at ZoneDelegate.invoke (zone.js:333) at Zone.run (zone.js:126) at ngzone.run (core.es5.js:3801) at PlatformRef_._bootstrapModuleFactoryWithZone (core.es5.js:4554) at core.es5.js:4596 at ZoneDelegate.invoke (zone.js:334) at Zone.run (zone.js:126) at zone.js:713 at ZoneDelegate.invokeTask (zone.js:367) at Zone.runTask (zone.js:166) at drainMicroTaskQueue (zone.js:546) at <anonymous> TypeError: Cannot read property 'get' of undefined at useFactory (http://localhost:9000/app.bundle.js:4404:52) at _callFactory (http://localhost:9000/vendor.bundle.js:10600:26) at _createProviderInstance$1 (http://localhost:9000/vendor.bundle.js:10543:26) at initNgModule (http://localhost:9000/vendor.bundle.js:10494:13) at new NgModuleRef_ (http://localhost:9000/vendor.bundle.js:11602:9) at createNgModuleRef (http://localhost:9000/vendor.bundle.js:11586:12) at Object.debugCreateNgModuleRef [as createNgModuleRef] (http://localhost:9000/vendor.bundle.js:13870:12) at NgModuleFactory_.create (http://localhost:9000/vendor.bundle.js:14865:25) at http://localhost:9000/vendor.bundle.js:5552:61 at ZoneDelegate.invoke (http://localhost:9000/vendor.bundle.js:289131:26) at Object.onInvoke (http://localhost:9000/vendor.bundle.js:4929:37) at ZoneDelegate.invoke (http://localhost:9000/vendor.bundle.js:289130:32) at Zone.run (http://localhost:9000/vendor.bundle.js:288923:43) at ngzone.run (http://localhost:9000/vendor.bundle.js:4797:62) at PlatformRef_._bootstrapModuleFactoryWithZone (http://localhost:9000/vendor.bundle.js:5550:23) at http://localhost:9000/vendor.bundle.js:5592:59 at ZoneDelegate.invoke (http://localhost:9000/vendor.bundle.js:289131:26) at Zone.run (http://localhost:9000/vendor.bundle.js:288923:43) at http://localhost:9000/vendor.bundle.js:289510:57 at ZoneDelegate.invokeTask (http://localhost:9000/vendor.bundle.js:289164:31) at Zone.runTask (http://localhost:9000/vendor.bundle.js:288963:47) at drainMicroTaskQueue (http://localhost:9000/vendor.bundle.js:289343:35) at <anonymous> consoleError @ zone.js:522 handleUnhandledRejection @ zone.js:527 _loop_1 @ zone.js:562 drainMicroTaskQueue @ zone.js:566 Promise resolved (async) scheduleQueueDrain @ zone.js:505 scheduleMicroTask @ zone.js:513 ZoneDelegate.scheduleTask @ zone.js:356 Zone.scheduleTask @ zone.js:196 Zone.scheduleMicroTask @ zone.js:207 scheduleResolveOrReject @ zone.js:711 ZoneAwarePromise.then @ zone.js:800 PlatformRef_._bootstrapModuleWithZone @ core.es5.js:4596 PlatformRef_.bootstrapModule @ core.es5.js:4581 (anonymous) @ ng2app.module.ts:140 __webpack_require__ @ bootstrap 2f644bad14cb0bb324ab:691 fn @ bootstrap 2f644bad14cb0bb324ab:110 (anonymous) @ app.js:116 __webpack_require__ @ bootstrap 2f644bad14cb0bb324ab:691 fn @ bootstrap 2f644bad14cb0bb324ab:110 (anonymous) @ util (ignored):1 __webpack_require__ @ bootstrap 2f644bad14cb0bb324ab:691 webpackJsonpCallback @ bootstrap 2f644bad14cb0bb324ab:23 (anonymous) @ app.bundle.js:1
解决方法
在这里你需要$injector,但它在被请求时没有被注入.
在docs中它说你应该使用ngdobootstrap钩子.
export function userServiceFactory(i: any) { return i.get('UserService'); } export const userServiceProvider = { provide: 'UserService',useFactory: userServiceFactory,deps: ['$injector'] }; import { browserModule } from '@angular/platform-browser'; import { UpgradeModule } from '@angular/upgrade/static'; import { platformbrowserDynamic } from '@angular/platform-browser-dynamic'; @NgModule({ imports: [ browserModule,providers: [ userServiceProvider ] }) export default class Ng2AppModule { constructor(private upgrade: UpgradeModule) { } ngdobootstrap() { this.upgrade.bootstrap(document.body,{ strictDi: true }); } } platformbrowserDynamic().bootstrapModule(Ng2AppModule);
由安德鲁·卢林编辑为后代
不幸的是,即使这正是在角度文档中写的正是如此.这里的原始答案是:
import { forwardRef } from '@angular/core'; useFactory: (forwardRef(() => '$injector')i: any) => i.get('UserService')
而这似乎比这更接近答案.这也不起作用 – 但这似乎是因为TypeScript不认为语法是正确的.
更新:
我们对useFactory如此着迷,以至于我们没有看到修复只是将forwardRef添加到服务中.
@Injectable() export class AnAngularservice{ constructor(@Inject(forwardRef(() => 'UserService')) private userService: UserService ){} }
angularjs – Angular ng-init:’通过服务器端脚本注入数据’
This directive can be abused to add unnecessary amounts of logic into
your templates. There are only a few appropriate uses of ngInit,such
as for aliasing special properties of ngRepeat,as seen in the demo
below; and for injecting data via server side scripting.
任何人都可以解释第二个用例:
…and for injecting data via server side scripting.
具体来说,使用此指令将值从Rails / PHP视图传递给Angular控制器是否合适?
其他方法(使用$location)似乎不必要地复杂化.
解决方法
如果数据是复杂对象和/或可能更改(或由客户端应用程序更改),则生成$http请求更有用.
angularjs – SignalR客户端方法在角度服务中多次发射
我正在使用SignalR将消息推送到移动设备,并且客户端方法被多次触发。当我注销哪个应该清理/关闭/停止连接时,它触发的次数会增长。
我的Hub看起来像下面这样
public class MyHub:Hub { private static string _groupIdentifier = "Test" public override Task OnConnected() { var identity = //grab identity from auth provider Groups.Add(Context.ConnectionId,string.Format("{0}-{1}",_groupIdentifier,identity.UserId)); return base.OnConnected(); } public void OnMessageCreated(Message message) { IHubContext context = GlobalHost.ConnectionManager.GetHubContext<MessageCreatedEmitter>(); context.Clients.Group(String.Format("{0}-{1}",message.userId)).onMessageCreated(obj); } public override Task OnReconnected() { var identity = //grab identity from my auth provider Groups.Add(Context.ConnectionId,identity.UserId)); return base.OnReconnected(); } public override Task Ondisconnected(bool stopCalled) { var identity = //grab identity from my auth provider Groups.Remove(Context.ConnectionId,identity.UserId)); return base.Ondisconnected(stopCalled); } }
我的客户端代码如下所示:
.service('Messages',function($rootScope,$q,$log,User,ENV){ var self = this; this.proxy = null; var initializeConnection = function(){ self.proxy = null; var connection = $.hubConnection(ENV.socketEndpoint,{ qs: {token:User.getToken()},logging: true,useDefaultPath: false }); self.proxy = connection.createHubProxy('myHub'); self.proxy.on('onMessageCreated',function(data){ $rootScope.$emit('Messages:messageReceived',data); }) connection.start().done(function(){ $log.info('connected'); }) } var cleanupConnection = function(){ if(self.proxy != undefined && self.proxy != null){ self.proxy.connection.stop(); } } $rootScope.$on('UserAuthenticated',function(event,data){ initializeConnection(); }); $rootScope.$on('UserLoggedOut',data){ cleanupConnection(); }); return self; }
我已经验证(或至少相信我有)以下
>我的集线器上的OnMessageCreated方法只被调用一次。
>当我注销我的移动设备时,连接被关闭或断开连接。
从目前的行为来看,似乎正在建立连接,或者客户端方法正在多次注册,并且在连接关闭后坚持,但是这似乎不正确,我无法证明它。
以上信息导致或可能导致客户端方法多次被触发?
在这一点上,我无法验证它是一个角色问题还是SignalR问题
If the controller is specified in the $routeProvider and in the HTML template it will get create once for each declaration.
服务是大自然的单身,但你真的可以很容易地混乱(正如我已经做的)在控制器。我曾经遇到过这样的情况,同样的数据被提取了四次。
我会双重检查所有控制器调用从模板和路由器,等等,你正在引用或需要一个。
在每次注销时都有新的实例可能引用路由器问题。可能来到根/上下文,具有该服务的控制器被重新初始化。那么这些控制器就会解释你所做的复数和混乱的每一个动作。
资料来源:AngularJS Controller execute twice
angularjs – 为什么我的角度服务值没有更新我的范围?
var app = angular.module("application",[]); app.service("valueSetter",function(){ that = this; this.serviceValue = {count: 1}; this.updatevalue = function(){ that.serviceValue.count = that.serviceValue.count + 1; console.log(that.serviceValue); }; }); app.controller("appcontroller",function($scope,valueSetter){ $scope.scopeValue = valueSetter.serviceValue.count; $scope.update = function(){ valueSetter.updatevalue(); }; });
而且HTML很简单:
<div ng-app="application" ng-controller="appcontroller"> Scope value is: {{scopeValue}}<br /><br /> <input type="button" value="update" ng-click="update()" /> </div>
如果您观察控制台,则可以看到服务值增量,但增量值不会反映在控制器范围中.我误解了这应该如何运作?
解决方法
this.getValue = function(){ return that.serviceValue; }
将控制器中的scopeValue分配给getter:
$scope.scopeValue = valueSetter.getValue;
像这样绑定:
Scope value is: {{scopeValue()}}
编辑
您还可以将valueSetter服务分配给控制器中的$scope变量:
$scope.valueSetter = valueSetter;
像这样绑定:
Service value is: {{valueSetter.serviceValue}}
Demo
编辑2
您还可以将服务中的this.serviceValue更改为对象,如下所示:
this.serviceValue = {value: 1}; this.updatevalue = function(){ that.serviceValue.value = that.serviceValue.value + 1; console.log(that.serviceValue.value); };
在您的控制器中,像这样分配scopeValue:
$scope.scopeValue = valueSetter.serviceValue;
然后像这样绑定:
Scope value is: {{scopeValue.value}}
Demo
关键是如果服务中的属性是一个原语(本质上是一个字符串,数字或布尔值),当你将它分配给一个范围变量时,你只是制作一个值的副本,它没有回链接服务.如果服务属性是一个对象,那么当您将其分配给范围变量时,您将复制对服务属性的引用,从而为您提供所需的绑定.
今天关于angularjs – 初始化非注入角度服务和angularjs初始化的方法的讲解已经结束,谢谢您的阅读,如果想了解更多关于Angular NgUpgrade将AngularJS服务注入Angular服务;获取:未处理的Promise拒绝:无法读取未定义的属性’get’;区:、angularjs – Angular ng-init:’通过服务器端脚本注入数据’、angularjs – SignalR客户端方法在角度服务中多次发射、angularjs – 为什么我的角度服务值没有更新我的范围?的相关知识,请在本站搜索。
本文标签: