Можете ли вы передать массив значений в ngSwitch?
У меня есть функционирование ngSwitch
<div class="columnFormatting" [ngSwitch]="statusIds">
<div *ngSwitchCase="2"> Do 2 </div>
<div *ngSwitchCase="4"> Do 4 </div>
<div *ngSwitchDefault> Default </div>
</div>
StatusIds может содержать одно или несколько целых чисел, разделенных запятыми.
Если statusIds равен [2,4], я хочу, чтобы он попадал в оба случая. Возможно ли это без цикла foreach вне коммутатора?
2 ответа
ngSwitch принимает только одно значение, но для отображения нескольких случаев вы можете сделать следующее.
<div class="columnFormatting" *ngFor="let status of statusIds" [ngSwitch]="status">
<div *ngSwitchCase="2"> Do 2 </div>
<div *ngSwitchCase="3"> Do 4 </div>
<div *ngSwitchDefault> Default </div>
</div>
С комбинацией ngFor и ngSwitch вы можете достичь того, что вы просили. Вам не нужно иметь цикл for вне коммутатора, вы можете использовать его вместе с коммутатором, как я упоминал выше.
Я надеюсь, что это поможет вам. Если у вас есть какие-либо проблемы или предложения, дайте мне знать.
Это устарело, но я искал этот ответ и в итоге нашел код ngSwitchCase и создал версию массива. Angular в основном использует этот код для проверки каждого ngSwitchCase с помощью DoCheck и внутри ngSwitch вызова _matchCase(value), также заметил, что код играет с подсчетом индексов, поэтому для каждого элемента в массиве вам нужно создать объект или проверить его самостоятельно. вне списка. Вот как я создал этот.
import { NgSwitch } from '@angular/common';
import {Directive, DoCheck, Host, Input, OnInit, Optional, TemplateRef, ViewContainerRef, ɵRuntimeError as RuntimeError} from '@angular/core';
@Directive({
selector: '[ngSwitchCaseArray]'
})
export class NgSwitchCaseArray implements DoCheck {
private _view: SwitchView;
/**
* Stores the HTML template to be selected on match.
*/
@Input() ngSwitchCaseArray: any[] = [];
constructor(
viewContainer: ViewContainerRef, templateRef: TemplateRef<Object>,
@Optional() @Host() private ngSwitch: NgSwitch) {
if (!ngSwitch) { // make sure we have a host
throwNgSwitchProviderNotFoundError('ngSwitchCaseArray', 'NgSwitchCaseArray');
}
this._view = new SwitchView(viewContainer, templateRef);
// either we add a case for each time we call ngSwitch._matchCase
// or we only add one case and call matchcase once per check
(this.ngSwitch as any)._addCase();
}
// this is how the ngSwitchCase works, just call's ngSwitch._matchCase(item) when true we're supposed to do something
ngDoCheck() {
this._view.enforceState(this.matchCase());
}
matchCase(): boolean {
// advantage of us finding the item in our array, is we're not calling matchCase which requires 1 addCase per call
// so if the array changes it wont break the case code we initialize with
var switchValue = (this.ngSwitch as any)._ngSwitch; // this is the value passed into ngSwitch
var index = this.ngSwitchCaseArray.indexOf(switchValue); // grab index, jic value is null, undefined, etc.
var item: any = this.ngSwitchCaseArray; // pass the array as default, should fail in most cases
if (index != -1) item = this.ngSwitchCaseArray[index]; // get the actual value if we found an index
return (this.ngSwitch as any)._matchCase(item); // MUST call _matchCase once and only once or you break ngSwitch
}
}
// stuff below was copied from angular/packages/common/src/directives/ng_switch.ts
class SwitchView {
private _created = false;
constructor(
private _viewContainerRef: ViewContainerRef, private _templateRef: TemplateRef<Object>) {}
create(): void {
this._created = true;
this._viewContainerRef.createEmbeddedView(this._templateRef);
}
destroy(): void {
this._created = false;
this._viewContainerRef.clear();
}
enforceState(created: boolean) {
if (created && !this._created) {
this.create();
} else if (!created && this._created) {
this.destroy();
}
}
}
function throwNgSwitchProviderNotFoundError(attrName: string, directiveName: string): never {
throw new RuntimeError(
2000, //RuntimeErrorCode.PARENT_NG_SWITCH_NOT_FOUND,
`An element with the "${attrName}" attribute ` +
`(matching the "${
directiveName}" directive) must be located inside an element with the "ngSwitch" attribute ` +
`(matching "NgSwitch" directive)`);
}
Тогда вам просто нужен код, чтобы он работал:
<div *ngSwitch="objectValue">
<div *ngSwitchCase="abc">abc found</div>
<div *ngSwitchCaseArray="[ 'value', 'Value', null, 'Blah', 'etc.' ]">Found something in the array</div>
<div *ngSwitchDefault>Nothing found</div>
</div>