【发布时间】:2017-06-16 17:17:20
【问题描述】:
我尝试遵循presentational and container 组件的概念。
场景很简单。有一些表示组件,包括表单标签和一些与 Store 交互的容器组件。
@Component({
selector: "presentational",
template:
`
<form>
<input [(ngModel)]="model.name" />
<button (click)="onSubmit()">Send</button>
</form>
`,
})
export class PresentationalCmp {
private model: Model;
@Output() emitter = new Emitter<Model>();
onSubmit() {
this.emitter.emit(this.model);
}
}
@Component({
selector: "container",
template: "<presentational (emitter)="addModel($event)"></presentational>"
})
export class ContainerCmp {
addModel(model: Model){
this.store.dispatch(..) //send model to server
}
}
我觉得这种方法合乎逻辑。但是有一个明显的问题。我的 PresentationalCmp 依赖于某些模型类型(此类型由商店操作使用)。这是错误的,但组件需要了解模型类型,因为它将属性(名称,...等)与输入标签绑定。
为了增加我真正的“PresentationalCmp”需要了解一些商店枚举(它由选择 html 标记的值组成)。
那么是不是意味着在其模板中包含表单标签的组件应该是容器,而不是展示?
【问题讨论】:
-
@Jota.Toledo 正如我从该答案中了解到的那样,如果演示性 cmp 了解某些商店类型或不了解某些商店类型(在该答案中键入 Good),这没什么可怕的?所以我的问题是关于它的。总是表现性被描述为“组件对 Store 一无所知”
-
归根结底,您的特定应用程序的需求应该超过严格遵守某些约定。虽然从智能组件中分离出视图组件作为一般原则是有意义的,但在某些时候对规则做出例外肯定是有意义的。我的建议是不要想太多。
标签: angular angular2-template ngrx