我创建了一个简单的“模态对话框”指令,它使用了transclude。我想在“模态对话框”指令中放置一个form()。我希望在指令中放置一个表单的formController,可以在父控制器的作用域中访问,但事实并非如此。请看一下以下小提琴:http://jsfiddle.net/milmly/f2WMT/1/
完整代码:
<!DOCTYPE html>
<html>
<head>
<title>AngJS test</title>
<link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/foundation/4.0.9/css/foundation.min.css">
<style>
.reveal-modal {
display: block;
visibility: visible;
}
</style>
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/angularjs/1.1.4/angular.min.js"></script>
<script type="text/javascript">
var app = angular.module('app', []);
app.controller('appCtrl', function ($scope) {
$scope.model = {
id: 1, name: 'John'
};
$scope.modal = {
show: false
};
});
app.directive('modal', function () {
return {
scope: {
show: '='
},
transclude: true,
replace: true,
template: '<div class="reveal-modal small" ng-show="show"><div class="panel" ng-transclude></div></div>'
}
});
</script>
</head>
<body ng-app="app">
<div ng-controller="appCtrl">
<div class="panel">
Id: {{ model.id }}<br>
Name: {{ model.name }}<br>
Controller formController: {{ form }}<br>
Directive formController: {{ myForm }}<br>
</div>
<form name="form" class="panel">
<input type="text" ng-model="model.name">
</form>
<a ng-click="modal.show=!modal.show">toggle dialog</a>
<div modal show="modal.show">
<form name="myForm">
<input type="text" ng-model="model.name">
</form>
</div>
</div>
</body>
</html>
所以我的问题是如何访问或是否可以从父控制器访问指令的formController?
感谢您的回答。
-Milan
答案 0 :(得分:28)
因为您正在使用transclude,该指令将创建一个子代码转换范围。从控制器范围(003)到指令的转换范围(005)没有简单的路径:
(硬/不推荐的路径是通过控制器作用域上的私有属性$$childHead
,找到隔离范围,然后使用$$nextSibling
进入被转换的范围。)
<强>更新强>
根据{{3}}的见解,我认为我们可以在指令中获取formController,然后使用=
将其传递给父级。
scope: { show: '=', formCtrl: '=' },
...
link: function(scope, element) {
var input1 = element.find('input').eq(0);
scope.formCtrl = input1.controller('form');
}
HTML:
<div modal show="modal.show" form-ctrl="formCtrl">
答案 1 :(得分:10)
这是我的解决方案: 我在父控制器中创建了这样的方法:
$scope.saveForm = function(form) {
$scope.myForm = form;
};
然后我在抄曲的内容中称呼它:
<my-directive>
<form name="myForm">
<div ng-init="saveForm(myForm)"></div>
</form>
</my-directive>
创建指令实例后,我在父作用域中有表单控制器实例。