小编Luc*_*ssa的帖子

不建议使用订阅:使用观察者而不是错误回调

当我运行lint时,它说:

subscribe is deprecated: Use an observer instead of an error callback
Run Code Online (Sandbox Code Playgroud)

代码(来自带有angular-cli的angular 7应用):

subscribe is deprecated: Use an observer instead of an error callback
Run Code Online (Sandbox Code Playgroud)

不确切地知道我应该使用什么以及如何使用...

谢谢!

callback deprecated subscribe rxjs tslint

45
推荐指数
6
解决办法
1万
查看次数

在Angular 2中测试ngOnChanges生命周期钩子

鉴于以下代码,我尝试测试ngOnChangesAngular2 的生命周期钩子:

import {
    it,
    inject,
    fdescribe,
    beforeEachProviders,
} from '@angular/core/testing';

import {TestComponentBuilder} from '@angular/compiler/testing';

import {Component, OnChanges, Input} from '@angular/core';

@Component({
    selector: 'test',
    template: `<p>{{value}}</p>`,
})
export class TestComponent implements OnChanges {
    @Input() value: string;

    ngOnChanges(changes: {}): any {
        // should be called
    }
}

fdescribe('TestComponent', () => {
    let tcb: TestComponentBuilder;

    beforeEachProviders(() => [
        TestComponentBuilder,
        TestComponent,
    ]);

    beforeEach(inject([TestComponentBuilder], _tcb => {
        tcb = _tcb;
    }));

    it('should call ngOnChanges', done => {
        tcb.createAsync(TestComponent).then(fixture => {
            let testComponent: …
Run Code Online (Sandbox Code Playgroud)

karma-jasmine angular2-testing angular2-components angular

25
推荐指数
3
解决办法
2万
查看次数

Angular 2.如何在Reactive Forms中使用控件对象数组

我需要动态创建textarea表单.我有以下模型:

this.fields = {
      isRequired: true,
      type: {
        options: [
          {
            label: 'Option 1',
            value: '1'
          },
          {
            label: 'Option 2',
            value: '2'
          }
        ]
      }
    };
Run Code Online (Sandbox Code Playgroud)

形式:

this.userForm = this.fb.group({
      isRequired: [this.fields.isRequired, Validators.required],
      //... here a lot of other controls
      type: this.fb.group({
         options: this.fb.array(this.fields.type.options),
      })
});
Run Code Online (Sandbox Code Playgroud)

模板的一部分:

<div formGroupName="type">
       <div formArrayName="options">
         <div *ngFor="let option of userForm.controls.type.controls.options.controls; let i=index">
            <textarea [formControlName]="i"></textarea>
         </div>
      </div>
</div>
Run Code Online (Sandbox Code Playgroud)

所以,你可以看到我有一些对象,我想使用label属性来显示它textarea.现在我明白了[object Object].如果我options改为简单的字符串数组,如:['Option 1', 'Option 2'] …

forms angular

13
推荐指数
2
解决办法
4万
查看次数

angular v5.1.0 HttpClient未设置头内容类型:application/json

我正在尝试将post api的头设置为application.json

let options: { headers?: {'Content-Type':'application/json'} }
Run Code Online (Sandbox Code Playgroud)

但没有设定.

httpclient angular

12
推荐指数
3
解决办法
2万
查看次数

在自定义错误处理程序中的Angular2中,如何使用.ts文件中的行号访问错误堆栈跟踪

我尝试在我的应用程序中按照文档实现自定义错误处理程序,但不知道如何访问原始ErrorHandler堆栈跟踪的输出.为什么我需要原创?由原始ErrorHandler打印到控制台的堆栈跟踪是指来自typescript .ts文件的行号(至少对于我的app文件).自定义ErrorHandler中可用的堆栈跟踪是指来自javascript .js文件的行号.

Angular2应用程序示例如下:

文件main.ts

import {bootstrap} from 'angular2/platform/browser';
import {App} from './app';
import {ExceptionHandler, provide} from "angular2/core";
class MyExceptionHandler  {
    call(error, stackTrace = null, reason = null) {
        let msg = ExceptionHandler.exceptionToString(error);
        console.log(msg);
        console.log('Message: ' + error.message);
        console.log('Stack trace: ' + stackTrace);
    }
}
bootstrap(App, [provide(ExceptionHandler, {useClass: MyExceptionHandler})]);
//bootstrap(App, []);
Run Code Online (Sandbox Code Playgroud)

文件app.ts

import {Component} from 'angular2/core'
@Component({
  selector: 'my-app',
  providers: [],
  template: `<div><h2>Hello {{name}}</h2></div>`,
  directives: []
})
export class App {
  constructor() {
    this.name = 'Angular2';
    let arr …
Run Code Online (Sandbox Code Playgroud)

angular

7
推荐指数
1
解决办法
3872
查看次数

如何在Angular2中正确使用依赖注入?

我在解决DI问题方面取得了成功.我已经阅读了一些教程并获得了jist但是在使用我的自定义服务制作了一些嵌套的DI后,事情开始崩溃了.

有人可以解释何时使用useFactory而不是useClass?我已经看过ng2文档,我已经看过这些例子,但是我无法将它们映射到我的问题中.目前我的引导程序看起来像这样:

bootstrap(
    App,
    [
        FORM_PROVIDERS,
        ROUTER_PROVIDERS,
        HTTP_PROVIDERS,
        provide(LocationStrategy, { useClass: PathLocationStrategy }),
        provide(RequestOptions, { useClass: DefaultRequestOptions }),
        provide(MsgService, { useClass: MsgService }),
        provide(HttpAdvanced, { useFactory: (MsgService, HTTP_PROVIDERS) => new HttpAdvanced(MsgService, HTTP_PROVIDERS), deps: [MsgService, HTTP_PROVIDERS] }),
        provide(AuthService, { useFactory: (HttpAdvanced) => new AuthService(HttpAdvanced), deps: [HttpAdvanced, HTTP_PROVIDERS, MsgService] }),
        provide(FormBuilderAdvanced, { useFactory: (FormBuilder, HttpAdvanced) => new FormBuilderAdvanced(FormBuilder, HttpAdvanced), deps: [FormBuilder, HttpAdvanced] }),
        provide(MsgServiceInternal, { useClass: MsgServiceInternal })
    ]
);
Run Code Online (Sandbox Code Playgroud)

我的最新一期是:

EXCEPTION: Error during instantiation of AuthService! (HeaderBar -> AuthService).
ORIGINAL EXCEPTION: …
Run Code Online (Sandbox Code Playgroud)

dependency-injection angular

6
推荐指数
1
解决办法
3215
查看次数

Angular 2动态组件加载ngOnChanges生命周期钩子调用

在动态组件加载的情况下,是否预期行为不会调用ngOnChanges生命周期钩子?只为我调用构造函数ngOnInit和ngAfterViewInit.但是根据文档,它应该在ngOnInit之前调用.

我正在加载这样的组件:

@ViewChild('place', { read: ViewContainerRef }) container: ViewContainerRef;

   private componentRef: ComponentRef<MyLoggerComponent>;

   constructor(private componentFactoryResolver: ComponentFactoryResolver) { }

   ngAfterViewInit() {
     const componentFactory: ComponentFactory<any> = this.componentFactoryResolver.resolveComponentFactory(MyLoggerComponent);
     this.componentRef = this.container.createComponent(componentFactory);
     this.componentRef.changeDetectorRef.detectChanges();
   }
Run Code Online (Sandbox Code Playgroud)

Plunker

angular

5
推荐指数
1
解决办法
3466
查看次数

来自 Web API 响应的角度日期

我正在开发一个 Angular (4.1.2) Web 应用程序以及相应的 ASP.Net Core (1.1) Web API。

我有一个 Angular 服务,它向我的 Web API 发出数据 http 请求,并且从 Angular 服务返回的对象中的日期不是类型Date

Tasks在我的场景中,我的 Web 应用程序从 SQL 数据库获取数据,每个应用程序都Task包含 start 和 finish DateTime。我的 TasksController 使用 AutoMapper 将每个任务映射Task到一个TaskViewModel对象,并且我的 TasksControllerTaskViewModel有一个类型为 的 start 和 finish 属性DateTime

如果我在 TasksController 中放置一个断点并检查TaskViewModel要返回的对象,那么在请求之后,开始和结束属性都是类型DateTime,因此日、月、小时等都可以。

在 Angular 中,我有一个task-api.service.ts包含以下代码的文件:

public getTasks(): Observable<Task[]> {
    let tasksArray: Observable<Task[]> = this.http.get("/api/tasks").map((response: Response) => {
        return <Task[]>response.json();
    }).catch(this.handleError); …
Run Code Online (Sandbox Code Playgroud)

datetime angular2-observables angular

5
推荐指数
1
解决办法
3231
查看次数

Angular5:动态组件加载 - 带有 @angular/core 依赖项的 StaticInjector 错误

我正在将一个电子应用程序从 AngularJS 迁移到 Angular5,并且我在需要加载任意模块及其组件并将主要组件动态渲染到视图的部分中遇到问题(它是一个插件系统)。在我的应用程序中,插件是一个 angular5 模块,其中包含在我的 angular5 应用程序中呈现的组件。

我像这样动态加载组件:

@ViewChild("view", { read: ViewContainerRef })
view: ViewContainerRef;

constructor(
  // ...
  private compiler: Compiler,
  private injector: Injector,
  private moduleRef: NgModuleRef<any>
) {}
Run Code Online (Sandbox Code Playgroud)

然后,

const addonModule = addonObject.getModule();
this.compiler
  .compileModuleAndAllComponentsAsync(addonModule)
  .then(factories => {
    const factory = factories.componentFactories.find(
      componentFactory =>
        addonObject.getViewComponent().name ==
        componentFactory.componentType.name
    );
    if (factory) {
      const cmpRef = factory.create(this.injector, [], null, this.moduleRef);
      cmpRef.instance.config = {
        from: "afd@test.com",
        apikey: "dsfkjd"
      };
      this.view.insert(cmpRef.hostView);
    }
  });
Run Code Online (Sandbox Code Playgroud)

它工作得很好,但是当我在模板中添加 Material Component 时,它失败并factory.create()出现以下错误:

模板:

<div>
    <button …
Run Code Online (Sandbox Code Playgroud)

angular-material2 angular

5
推荐指数
1
解决办法
2919
查看次数

RXJS 等待所有 Observables 完成并返回结果

我正在尝试创建一个 RX 流,它将执行异步的 XHR 调用列表,然后在进行下一次调用之前等待它们完成。

为了帮助解释这一点,可以在普通 JS 中这样写:

try {
    await* [
        ...requests.map(r => angularHttpService.get(`/foo/bar/${r}`))
    ];
} catch(e) { throw e }

// do something
Run Code Online (Sandbox Code Playgroud)

这是我正在尝试的代码,但它单独运行它们,而不是在继续之前等待它们全部完成。(这是一个 NGRX 效果流,因此它与 vanilla rx 略有不同)。

mergeMap(
        () => this.requests, concatMap((resqests) => from(resqests))),
        (request) =>
            this.myAngularHttpService
                .get(`foo/bar/${request}`)
                .pipe(catchError(e => of(new HttpError(e))))
    ),
    switchMap(res => new DeleteSuccess())
Run Code Online (Sandbox Code Playgroud)

rxjs ngrx

5
推荐指数
1
解决办法
6396
查看次数

来自 HTTP 拦截器的 Angular 4 HTTP 请求

我正在尝试更新Http到较新的HttpClient.

对于 JWT 刷新,我扩展了Http类并覆盖了request()方法(/sf/answers/3202568981/)。
现在我想对拦截器做同样的事情。

这是我现在拥有的拦截器:

export class JwtRefreshInterceptor implements HttpInterceptor {

  public constructor(
    private httpClient: HttpClient,
  ) { }

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return next.handle(request).catch((error: HttpErrorResponse) => {
      if (error.status === 401) {
        return this.httpClient.post(environment.base_uri + 'auth/refresh', {}).flatMap((response) => {
          // get token from response.
          // put token in localstorage.
          // add token to the request.

          // Do the request again with the new token.
          return next.handle(request); …
Run Code Online (Sandbox Code Playgroud)

http jwt angular-http-interceptors angular

3
推荐指数
1
解决办法
3488
查看次数