GVKun编程网logo

angularjs – 初始化非注入角度服务(angularjs初始化的方法)

22

这篇文章主要围绕angularjs–初始化非注入角度服务和angularjs初始化的方法展开,旨在为您提供一份详细的参考资料。我们将全面介绍angularjs–初始化非注入角度服务的优缺点,解答ang

这篇文章主要围绕angularjs – 初始化非注入角度服务angularjs初始化的方法展开,旨在为您提供一份详细的参考资料。我们将全面介绍angularjs – 初始化非注入角度服务的优缺点,解答angularjs初始化的方法的相关问题,同时也会为您带来Angular NgUpgrade将AngularJS服务注入Angular服务;获取:未处理的Promise拒绝:无法读取未定义的属性’get’;区:、angularjs – Angular ng-init:’通过服务器端脚本注入数据’、angularjs – SignalR客户端方法在角度服务中多次发射、angularjs – 为什么我的角度服务值没有更新我的范围?的实用方法。

本文目录一览:

angularjs – 初始化非注入角度服务(angularjs初始化的方法)

angularjs – 初始化非注入角度服务(angularjs初始化的方法)

我有一个角度服务,在其构造函数中侦听$rootscope上的事件.

此服务不会在应用程序中的任何位置注入,因此不会初始化.
要解决这个问题,我们只是注入它而不是在另一个服务中使用它,只是为了让它“新手”.

有没有办法初始化服务而不必将其注入其他服务/控制器/指令?

解决方法

通常,Angular为您提供了module.run(fn)API来进行初始化. fn参数是完全可注射的,所以如果你有一个服务,例如myService,暴露了一个init()方法,你可以将其初始化为:

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’;区:

Angular NgUpgrade将AngularJS服务注入Angular服务;获取:未处理的Promise拒绝:无法读取未定义的属性’get’;区:

我在这里看到了很多类似的问题,但还没有找到一个有效的解决方案.我认为正在发生的是,因为我们的Ng2App首先被引导,它还没有引用$injector,所以当我尝试在我的提供者声明(deps:[‘$injector’])中使用它时,它没有’存在.

什么是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

解决方法

这似乎是调整@NgModule({providers:[]})和upgrade.bootstrap解决方案的问题.

在这里你需要$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:’通过服务器端脚本注入数据’

angularjs – Angular ng-init:’通过服务器端脚本注入数据’

来自关于ng-init的Angular文档:

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)似乎不必要地复杂化.

解决方法

绝对.如果您的PHP或Rails应用程序生成模板,并且方便(且安全)将数据从该应用程序作为ng-init属性值传递给Angular应用程序,那么这是一个有效的用例.

如果数据是复杂对象和/或可能更改(或由客户端应用程序更改),则生成$http请求更有用.

angularjs – SignalR客户端方法在角度服务中多次发射

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 – 为什么我的角度服务值没有更新我的范围?

angularjs – 为什么我的角度服务值没有更新我的范围?

我有 this simple jsfiddle,它演示了我认为是一个动态服务值,可以被注入它的任何控制器监视.这是角度代码:

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>

如果您观察控制台,则可以看到服务值增量,但增量值不会反映在控制器范围中.我误解了这应该如何运作?

解决方法

您无法绑定到这样的服务变量,但您可以绑定到服务功能.在服务中添加一个getter:

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 – 为什么我的角度服务值没有更新我的范围?的相关知识,请在本站搜索。

本文标签: