【发布时间】:2015-01-04 13:21:28
【问题描述】:
我有一个模式,其中许多项目类型都是“可编辑的”。这意味着我有很多模板(每个可编辑项目类型一个),它们希望具有唯一的字段,但具有通用功能(编辑、保存、取消编辑、删除等)。这些常见的功能导致控制器上的大量重复: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>
问题是所有模型都来自 controller 范围,因为它们是此模板独有的,而重复的范围项,如函数 save() cancel() edit() delete() 都来自指令隔离范围。
我是,嗯,混合范围,当然我无法提前知道哪些项目需要可用。因此,如果我嵌入:
- 隔离范围:我无法访问嵌入元素中的控制器模型以及用于验证的表单
- 控制器范围(默认):我无法访问指令中添加的 on 函数,这首先是指令的重点!
我在这里做错了;什么是更好(更清洁?)的方法?
【问题讨论】:
-
是的,好点。并且 transclude 范围是一个子范围。如果我隔离了呢?
-
我错了,我的小提琴没有创建一个新的范围,它使用的是同一个范围。我已经更新了小提琴,如您所见,即使它在 childScope 上,您仍然可以从指令中的 html 访问方法。在隔离范围内,您可以将指令中的方法声明为
$scope.$parent.$save = function...updated fiddle to reflect both inherited and isolated scope -
我想通了。我设法做了类似的事情,但没有玩弄父范围。
标签: angularjs angularjs-directive angularjs-scope angularjs-ng-transclude