Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AngularJS:以正确的方式从控制器调用指令函数_Angularjs - Fatal编程技术网

AngularJS:以正确的方式从控制器调用指令函数

AngularJS:以正确的方式从控制器调用指令函数,angularjs,Angularjs,我有两种情况: 从指令调用控制器中定义的函数。 该指令包含一个“&”范围限制,用于关联控制器和指令功能。如果单击文本,将在指令中触发元素单击事件,并调用控制器函数$scope.$apply用于通知AngularJS单击事件,并刷新屏幕上的var值 指令中定义的函数从控制器调用。 该指令没有任何范围限制,这意味着控制器中的$scope和指令中的scope是共享的。我在指令中定义了func1,可以从控制器中调用。请尝试单击文本,但这似乎有干扰性,因为控制器需要知道函数的名称 是否有一种方法可以定义f

我有两种情况:

从指令调用控制器中定义的函数。 该指令包含一个“&”范围限制,用于关联控制器和指令功能。如果单击文本,将在指令中触发元素单击事件,并调用控制器函数$scope.$apply用于通知AngularJS单击事件,并刷新屏幕上的var值

指令中定义的函数从控制器调用。 该指令没有任何范围限制,这意味着控制器中的$scope和指令中的scope是共享的。我在指令中定义了func1,可以从控制器中调用。请尝试单击文本,但这似乎有干扰性,因为控制器需要知道函数的名称


是否有一种方法可以定义func1,使函数名在指令div中声明,类似于场景1?

这两个选项都是可能的,并且可以接受,具体取决于您构建组件的方式

选项1-控制器应在使用隔离作用域时注册侦听器/回调,并在指令上设置属性-我建议这样做。控制器不应调用指令函数,而应更改已绑定到指令上的属性。如果安装正确,则指令应该监视此属性并相应更新

在我看来,指令不应该知道它们的控制器是谁,它促进了代码的解耦。相反,控制器应该设置回调函数,指令可以在适当的时间调用这些函数,即让控制器知道某些东西被单击、选择、删除、刷过等等

选项2-当您构建一个提供结构和行为逻辑但不定义实际单个组件UI(不包括可能的框架UI)的web组件时,我可以接受。例如,list指令。指令中可能没有定义单独的列表,而是针对每个上下文或使用插入,从而为我们提供了一个更模块化和可重用的组件。它确实要求我们了解有关该指令的一些情况。它还要求我们修改transclusion函数,以便在转写的内容上使用directives作用域,而不是原始controllers作用域。例如,您可以签出我制作的列表组件作为示例

这篇文章的一段文字。sf list指令是定义列表行为的独立作用域指令。然而,我们仍然可以通过修改的转换来定义每个列表项的外观。它依靠我们调用selectItem来触发列表上的选择行为

<sf-list items="ctrl.emails" listener="ctrl.adapter">
    <div class="list-item email" ng-click="selectItem(item)" ng-repeat="item in items track by item.id">
        <div class="from">{{ item.from }}:</div>
        <div class="subject">{{ item.subject }}</div>
    </div>
</sf-list>

谢谢你,斯皮迪。您说应该更改已绑定在指令上的属性,您能给出一个属性更改后触发函数调用的示例吗?对于这个单击的特定示例,我想不出您将如何或为什么更改属性以触发函数调用。看看我更新的最后一段,我认为更好地回答了你在选项2中试图做的事情。