gpt4 book ai didi

AngularJS : How to transclude and have both isolate scope and parent scope?

转载 作者:行者123 更新时间:2023-12-02 20:41:28 29 4
gpt4 key购买 nike

我有一个模式,其中许多项目类型都是“可编辑的”。这意味着我有很多模板(每种可编辑项目类型一个),这些模板期望具有唯一的字段,但具有通用功能(编辑、保存、取消编辑、删除等)。这些常见功能导致 Controller 上出现大量重复操作:saveeditcancel 等,以及非常重复的错误处理。

我考虑的处理这个问题的一种方法是让每个 Controller “装饰”自己(使用服务),但它也变得困惑。

我更喜欢指令,例如“可编辑”:

<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() 全部来自指令隔离范围。

我正在混合范围,当然我无法提前知道需要提供哪些项目。所以如果我嵌入:

  • 隔离范围:我无法访问嵌入元素中的 Controller 模型以及验证表单
  • Controller 范围(默认):我无法访问指令中添加的功能,这首先是指令的要点!

我在这里做错了什么;什么是更好(更干净?)的方法来做到这一点?

最佳答案

我通过回避 ng-transclude 并在链接函数中进行自己的嵌入来设法解决这个问题。

以下内容与正常的 ng-transclude 等效:

link: function (scope,element,attrs,ctrlr,transclude) {
var sc = scope.$parent.$new();
transclude(sc,function(clone,scope) {
element.append(clone); // or however else you want to manipulate the DOM
});
}

通过将函数直接添加到嵌入子作用域中,我能够让一切正常工作,而不会干扰父作用域,这是我真的不想做的。

link: function (scope,element,attrs,ctrlr,transclude) {
var sc = scope.$parent.$new();
sc.editMode = false;
sc.save = function() {
};
sc.edit = function () {
sc.editMode = true;
};
// etc.
transclude(sc,function(clone,scope) {
element.append(clone); // or however else you want to manipulate the DOM
});
}

两全其美!

关于AngularJS : How to transclude and have both isolate scope and parent scope?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27765924/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com