Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.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 如何对自定义指令&x27;调用方法;在Angular.js中,将隔离范围从转置控制器中移除_Angularjs_Angularjs Directive - Fatal编程技术网

Angularjs 如何对自定义指令&x27;调用方法;在Angular.js中,将隔离范围从转置控制器中移除

Angularjs 如何对自定义指令&x27;调用方法;在Angular.js中,将隔离范围从转置控制器中移除,angularjs,angularjs-directive,Angularjs,Angularjs Directive,我在dt模块下创建了一个名为dt modal的指令。在我的主应用程序名为demo的模块中,我使用这个dt模式,它有一个独立的作用域。我创建了这个指令,这样在指令中编写的HTML表单就被屏蔽了,因为我想对许多不同的表单重用这个模式 <dt-modal> <form ng-controller="ReviewFormController" name="reviewForm" novalidate ng-sub

我在dt模块下创建了一个名为dt modal的指令。在我的主应用程序名为demo的模块中,我使用这个dt模式,它有一个独立的作用域。我创建了这个指令,这样在指令中编写的HTML表单就被屏蔽了,因为我想对许多不同的表单重用这个模式

<dt-modal>
    <form ng-controller="ReviewFormController" 
          name="reviewForm" 
          novalidate 
          ng-submit="reviewForm.$valid && submitReview(review)">

      <!-- form contents here --> 

    </form>
</dt-modal>

此转包表单有一个名为ReviewFormController的自定义控制器,用于侦听提交事件。如何从ReviewFormController中的submitReview()中调用dt模态作用域上的close()方法

这是一个JSBin。如果按ESC键,可以在指令运行中看到close()

如果这是不可能的,是否有更好的设计,该指令


提前谢谢

我的建议是使用
$emit
从控制器触发事件,并直接在控制器上使用$on

控制器

scope.$emit("ValueChanged", value);
指令中将使用
$on
捕获事件,如:

$scope.$on("ValueChanged", function(event, ars){
   ... //your event has been triggered.    
});
重要提示:

指令应该始终是独立的组件,如果指令内部有来自控制器(指令外部)的方法调用,这将在我的指令和控制器之间创建一个依赖关系,当然这将迫使一个指令不能在没有另一个的情况下存在

如果我必须将设计原则应用于指令,那么它将是一个坚实的、单一责任的原则。指令应该能够封装并独立工作


由于您使用的是隔离作用域,因此可以将

<dt-modal id="review-form-modal" api="modal.api">
然后,
ng单击
可以使用控制对象调用
关闭

<button type="submit" ng-click="modal.api.close()">Submit</button>
提交

如果您想尝试这段代码,.

我确实尝试过这段代码,它可以工作,但是作为指令的公共API的一部分,外部组件必须确保发出正确的事件,以便指令能够相应地响应。我希望有某种方式,指令可以通过HTML层次结构将方法公开为公共API,而ReviewFormController(子/转置)可以调用这些公共API方法中的任何一种。如果你需要听起来更像是服务的“公共”方法,那么你可以使用服务来实现这一点。我曾考虑将模式打开/关闭放在服务中,但这需要在服务中进行DOM操作,这似乎违反了角度约定。情态形式似乎是这样一个共同特征。人们通常如何处理这个问题?有没有比我开始的更好的方法?在子控制器上使用父作用域,并将属性添加到指令并观察它是另一个选项transclude控制器的父作用域在ReviewFormController中不可用。我想这是因为dt modal指令有一个隔离作用域。我可以使用它,但我想从零开始学习如何使用它。聪明。绝对是最好的解决方案。非常感谢。
<button type="submit" ng-click="modal.api.close()">Submit</button>