Angularjs Ng if和自定义指令

Angularjs Ng if和自定义指令,angularjs,angularjs-directive,Angularjs,Angularjs Directive,我一直在创建涉及加载数据初始化的自定义指令。由于此初始化取决于绑定到指令内隔离作用域的父对象的作用域对象的状态,因此我将指令封装在ng if语句中,因此它们仅在DOM中呈现,因此在创建适当的父作用域对象后进行初始化 Ng if似乎更可取,因为指令有绑定到$watchs的各种API调用,我希望在数据有效之前不要触发这些调用 例如,我有一个指令,它提供了一个用于编辑计划事件的接口。父页面允许用户选择要编辑的事件,或创建新事件。创建新事件的方式允许用户选择各种值来预先填充事件对象(开始日期、事件类型、

我一直在创建涉及加载数据初始化的自定义指令。由于此初始化取决于绑定到指令内隔离作用域的父对象的作用域对象的状态,因此我将指令封装在ng if语句中,因此它们仅在DOM中呈现,因此在创建适当的父作用域对象后进行初始化

Ng if似乎更可取,因为指令有绑定到$watchs的各种API调用,我希望在数据有效之前不要触发这些调用

例如,我有一个指令,它提供了一个用于编辑计划事件的接口。父页面允许用户选择要编辑的事件,或创建新事件。创建新事件的方式允许用户选择各种值来预先填充事件对象(开始日期、事件类型、事件是否绑定到数据库中的其他对象等)

当用户做出处理事件所需的选择时,ng if wrapping指令将设置为true,并且该事件(对于编辑,是现有事件;对于添加,是自定义服务创建的事件的框架)绑定到指令的隔离范围

这可以防止$watchs在有效事件绑定到指令之前触发,还允许我初始化指令本地的一些变量,以便验证和处理事件的数据

我遇到的问题是,将指令封装在ng if中会隔离隔离范围

例如,事件的开始时间可能由用户在从控制器创建新事件时指定,也可能不由用户指定。如果没有,我想根据指令中的其他变量计算默认开始时间。如果他们这样做了,那么我想使用这个值

我这样做的方式是将一个范围变量从控制器绑定到指令的隔离范围:

scope: {
   editEvent: '=',
   overrideTime: '='
}
<add-edit-event ng-if="viewEdit" event="editEvent" override-time="overrideTime">
</add-edit-slot>
这是作为my指令的属性传递的:

scope: {
   editEvent: '=',
   overrideTime: '='
}
<add-edit-event ng-if="viewEdit" event="editEvent" override-time="overrideTime">
</add-edit-slot>
我经常遇到这样的情况,指令包含在ng if中这一事实导致范围复杂化,这让我觉得我的一般方法有问题


是否有更好的方法来处理自定义指令的条件初始化和加载,或者将它们封装在ng if语句中,只要我适当地处理插入ng if的范围,就可以了?

您是否认为问题可能不是
ng if
而是孤立的范围?你不认为这会造成不必要的复杂性吗?在使用此指令的上下文中,隔离作用域是否比简单的子作用域有任何优势?@getOffMyLawn此指令以及我遇到此问题的其他指令,旨在在整个应用程序中的多个位置重复使用。根据Angular指令规范,“最佳实践:在制作要在整个应用程序中重用的组件时,使用scope选项创建隔离作用域。”此外,我的一条指令(不是上面的示例指令)在某些页面上以ng重复调用,但在其他页面上用作单个元素,所以隔离范围似乎是强制性的。我理解,但这并不意味着你必须始终遵循最佳实践,有时你必须打破规则来简化某些事情。隔离作用域是为可重用组件提升的,但在某些情况下它实际上没有提供任何好处,例如,当可重用指令没有附加或读取作用域中的任何值时,它是否在可重用性上下文中被隔离并不重要。我想用我的评论,让你调查,如果它实际上是值得的,在你考虑的情况下有孤立的范围。我并不是说它不是。@getOffMyLawn很公平,老实说,在阅读了您的评论之后,我开始质疑我作为示例使用的特定指令的范围(因此您的评论非常有用)。然而,我认为这个问题本身仍然(希望)有效和相关,因为隔离范围对于我在某些地方的ng重复中使用的另一个指令似乎是必要的。