Я работаю над приложением angular 2, и в одном из моих компонентов у меня есть следующее:
<p class="newNode">
<input [(ngModel)]="formNode.id" placeholder="id">
<input [(ngModel)]="formNode.name" placeholder="name">
<input [(ngModel)]="formNode.type" placeholder="image">
<button (click)="addNode()">Add</button>
</p>
<app-node-info *ngFor="let node of ((nodesService.observable | async) | immutableMapOfMaps)"
[node]="node"
[removeNode]="removeNode.bind(this)"
[class.active] = "(viewService.observable | async).get('currentNode') === node.id"
(click) = "viewService.setCurrentNode(node.id)">
</app-node-info>
Отлично работает в браузере, но когда я пытаюсь связать свой соответствующий ts-файл, я получаю эту ошибку линтинга: «Метод« async », к которому вы пытаетесь получить доступ, не существует в объявлении класса. (No-access-missing- member) 'at: '11, 21 "
Код моего компонента выглядит следующим образом:
import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';
import { clone } from 'ramda';
import { UUID } from 'angular2-uuid';
import { StateService } from '../state.service';
import { D3Node } from '../../non-angular/interfaces';
import { NodesService, ViewService } from '../../non-angular/services-helpers';
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
selector: 'app-list-of-nodes',
styleUrls: ['./list-of-nodes.component.css'],
templateUrl: './list-of-nodes.component.html',
})
export class ListOfNodesComponent implements OnInit {
formNode: D3Node;
/**
* The injected service from ./state.service
*/
private nodesService: NodesService;
private viewService: ViewService;
constructor(state: StateService) {
this.nodesService = state.twiglet.nodes;
this.viewService = state.view;
}
ngOnInit () {
this.formNode = {
id: UUID.UUID(),
name: (Math.random().toString(36) + '00000000000000000').slice(2, 6),
type: (Math.random().toString(36) + '00000000000000000').slice(2, 3),
};
}
addNode () {
this.nodesService.addNode(clone(this.formNode));
this.formNode = {
id: UUID.UUID(),
name: (Math.random().toString(36) + '00000000000000000').slice(2, 6),
type: (Math.random().toString(36) + '00000000000000000').slice(2, 3),
};
}
removeNode (node: D3Node) {
this.nodesService.removeNode(node);
}
}
Это какой-то тип антипаттерна для использования асинхронного канала в чем-то другом, кроме ngFor?
Я знаю, что могу подписаться на наблюдаемое и установить response = для некоторой локальной переменной, а затем сравнить это вместо использования асинхронного канала в [class.active], но я бы предпочел не делать что-то в моем файле .ts, что я могу просто сделать в моем html файле.
Есть ли способ обойти эту ошибку, чтобы линтер не кричал на меня? У меня есть хуки предварительной фиксации github, которые проверяют линтинг, поэтому мне нужно постоянное решение. Я действительно понял, что могу поставить // tslint:disable-line
в строке, которая говорит об обнаружении изменений (строка 11) и исправляет это, но я не знаю почему.
[class.active] = "(viewService.observable | async).get('currentNode') === node.id"
из файла шаблона, линтинг пройдет. Это то, что для меня так странно, как будто tslint каким-то образом импортирует шаблон. - person Ben Hernandez   schedule 20.12.2016async
- person olsn   schedule 20.12.2016