我想知道解决此问题的最佳方法是什么,而我对TypeScript和Angular还是很陌生。使用Angular 5。
无论如何。我通过表格在页面上有元素列表。
这是控制所述列表的代码。
<tbody>
<tr class="text-center" *ngFor="let topic of topics">
<td *ngIf="!editTopicMode">{{ topic.name }}</td>
<td id="{{topic.id}}" *ngIf="editTopicMode">
<form>
<div class="form-group">
<input class="form-control" type="text" name="name" value="{{topic.name}}" />
</div>
</form>
</td>
<td>
<div *ngIf="!editTopicMode" class="btn-group btn-group-sm">
<button class="btn btn-link" (click)="editTopicBtnClick(topic.id)">
<i class="fa fa-pencil fa-2x" aria-hidden="true"></i>
</button>
<button class="btn btn-link">
<i class="fa fa-trash fa-2x" aria-hidden="true"></i>
</button>
</div>
<div *ngIf="editTopicMode" class="btn-group-sm">
<button class="ml-2 btn btn-sm btn-outline-secondary" (click)="cancelEditMode()">Cancel</button>
<button class="ml-2 btn btn-sm btn-outline-primary">Save</button>
</div>
</td>
</tr>
</tbody>
我打算做的是,如果用户单击铅笔(编辑)图标,那么相邻的div将从常规td更改为输入,而“编辑/删除”按钮则更改为“取消”。编辑按钮组。 (我知道我需要稍稍更改html,因为按钮当前不在表单元素中,但是在将其连接起来的位置上我不在那儿。)
我想到了两种方法来做到这一点。 1)使用ngIf,这样我就可以保存渲染的元素,并且edit / cancel按钮可以切换editMode;或2)使用ngClass并切换display:没有css类用于单击的按钮。
现在,当您单击编辑按钮时,无论您单击哪个编辑按钮,它都会将所有列翻转为输入,而不仅仅是用户要编辑的行。
这是我的内容ts:
import { Component, OnInit, TemplateRef, ElementRef, ViewChild, Inject } from '@angular/core';
import { Topic } from '../models/topic';
import { TopicService } from '../services/topicService/topics.service';
import { AlertifyService } from '../services/alertify/alertify.service';
import { ActivatedRoute } from '@angular/router';
import { DOCUMENT } from '@angular/common';
@Component({
selector: 'app-topics',
templateUrl: './topics.component.html',
styleUrls: ['./topics.component.css']
})
export class TopicComponent implements OnInit {
@ViewChild('topicId') topicId: ElementRef;
topics: Topic[];
newTopic: Topic = {
id: 0,
name: '',
};
editTopicMode = false;
constructor(
@Inject(DOCUMENT) document,
private topicsService: TopicService,
private alertify: AlertifyService,
private route: ActivatedRoute
) { }
ngOnInit() {
//this.route.data.subscribe(data => {
// this.topics = data['topics'];
//})
this.getTopics();
}
getTopics() {
this.topicsService.getAllTopics()
.subscribe(data => {
this.topics = data;
}, error => {
this.alertify.error(error);
});
}
addTopic() {
this.topicsService.createTopic(this.newTopic)
.subscribe((topic: Topic) => {
this.topics.push(topic);
this.alertify.success(this.newTopic.name + ' added as a new topic.');
this.newTopic.name = '';
},
(err: any) => {
this.alertify.error(err);
}
)
}
editTopicBtnClick(event) {
console.log(event);
this.editTopicMode = true;
console.log(document.getElementById(event));
}
cancelEditMode() {
this.editTopicMode = !this.editTopicMode;
}
}
对实现这一目标的最佳方式(最佳方式)有何想法?
答案 0 :(得分:0)
使用* ngIf很好,只需确保将* ngIf变量设置为指向某个特定于* ngFor特定行的东西
此示例可能更简洁,但您可以轻松完成
print
答案 1 :(得分:0)
您已经完成了所有艰苦的工作。
对于单项编辑,剩下的就是:将editTopicMode
更改为editTopicId
之类。
然后您可以:
topic.id
,例如在关闭编辑时将其设置为null
*ngIf
更改为editTopicId === topic.id
(或根据需要更改!==
)那应该是全部。
如果要启用多个编辑,只需为每个主题添加一个名为isInEditMode
的属性。
*ngIf
支票变成topic.isInEditMode
isInEditMode
属性就像false
一样,因为undefined
是一个伪造的值topic.isInEditMode
设置为true
,在关闭编辑时将false
设置