我有一个模式,其中许多项目类型是“可编辑的”。这意味着我有很多模板(每个可编辑项目类型一个),它们希望具有唯一的字段,但具有通用功能(编辑、保存、取消编辑、删除等)。这些常见的功能会导致控制器上的大量重复:save
、edit
、cancel
等,以及非常重复的错误处理。
我处理这个问题的一种方法是让每个控制器“装饰”自己(使用服务),但它也变得一团糟。
我更喜欢一个指令,比如“可编辑”:
<form name="editGroup" editable>
<div ng-show="editMode">
<!-- lots of fields, e.g. -->
<input type="text" ng-model="name"></input>
<span ng-show="editGroup.name.$error.required">The name is required</span>
<button type="submit" ng-click="save()">Save</button>
<button ng-click="cancel">Cancel</button>
</div>
<div ng-show="!editMode">
<!-- lots of text, e.g. -->
<span>{{name}}</span>
<button ng-click="edit()">Edit</button>
<button ng-click="delete()">Delete</button>
</div>
</form>
问题是所有模型都来自控制器范围,因为它们是这个模板独有的,而重复的范围项,如功能save()
cancel()
edit()
delete()
都来自指令隔离范围。
我是,嗯,混合范围,当然我无法提前知道哪些项目需要可用。因此,如果我包含以下内容:
- 隔离范围:我无法访问嵌入元素中的控制器模型,以及用于验证的表单
- 控制器范围(默认):我无法访问指令中添加的 on 函数,这首先是指令的重点!
我在这里做错了什么;什么是更好(更清洁?)的方法来做到这一点?