【问题标题】:AngularJS : How to transclude and have both isolate scope and parent scope?AngularJS:如何转换并同时拥有隔离范围和父范围?
【发布时间】:2015-01-04 13:21:28
【问题描述】:

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

我处理这个问题的一种方法是让每个控制器“装饰”自己(使用服务),但它也变得混乱。

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

<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


【解决方案1】:

我设法通过避开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
   });
}

通过将函数直接添加到 transclude 子作用域,我能够让一切正常工作,而不会弄乱我真的不想这样做的父作用域。

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
   });
}

两全其美!

【讨论】:

  • 你能在这里展示完整的代码或提供一个工作演示吗?
  • 当然。这是一个工作的jsfiddle。它既粗鲁又简单,但确实有效。
  • 谢谢!我尝试了隔离范围和绑定控制器,发现您的解决方案在那里也有效。在这里演示:jsfiddle.net/karlhorky/s8pynxtf
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多