【发布时间】:2016-07-07 15:26:18
【问题描述】:
我有一个简单的指令,它将一段嵌入的内容重复两次。像这样。
link: function (scope, element, attrs, controller, transclude) {
transclude(scope.$parent, function(clone) {
element.find('[transclude-main]').replaceWith(clone);
});
transclude(scope.$parent, function(clone) {
element.find('[transclude-overflow]').replaceWith(clone);
});
});
这主要按预期工作,但如果内容包含一个表单,那么我最终会得到两个具有相同名称的表单。
更重要的是,我的主页控制器(客户)仅引用其中一种表单(customers.myForm),因此如果我尝试重置表单或调用任何其他表单控制器功能,显然只有其中一种表单发生变化。
因此,我尝试修改我的代码以查找表单并将表单名称更改为新名称,例如这样。
link: function (scope, element, attrs, controller, transclude) {
transclude(scope.$parent, function(clone) {
element.find('[transclude-main]').replaceWith(clone);
});
transclude(scope.$parent, function(clone) {
clone.find('FORM').each(function() {
$(this).attr('name', $(this).attr('name') + '2');
});
element.find('[transclude-overflow]').replaceWith(clone);
});
});
这确实为我修改了 HTML,我最终得到了两个表单 - myForm 和 myForm2。
问题是我的主控制器中仍然只有一个对 myForm 的引用。第一个有效,但第二个无效。我只能假设它们是以某种方式针对 scope.$parent 编译的,在我弄乱克隆之前,我将其传递给 transclude 函数?如果是这种情况,我不知道如何解决。
编辑:
在此处添加了一个 plunkr:
https://plnkr.co/edit/XE7REjJRShw43cpfJCh2
如果您打开开发控制台,您会看到我正在使用 console.log 写出 myForm 和 myForm2 的内容,这应该是我的第二个工具栏中的表单的两个副本。 myForm2 不存在,我怀疑这是因为它是在克隆之前针对父范围编译的。
【问题讨论】:
-
“我的主控制器中仍然只有一个对 myForm 的引用”是什么意思?你能链接到一个 plunker 吗?
-
我还没有真正使用过 Plunkr,但会试一试。
-
Plunkr 补充说:)我还在这里提出了一个后续问题,询问是否可以在不包含嵌入的情况下完成此操作。如果可以在这个有赏金的问题上得到答案,那么我很乐意删除另一个问题。 stackoverflow.com/questions/38332873/…
-
您的 plunkr 中既不存在 $scope.myForm 也不存在 $scope.myForm2(从您的 2 个 console.log 打印)?
-
在 plunkr 中,您似乎也在尝试查找不存在的
FORM元素?
标签: javascript angularjs angularjs-ng-transclude transclusion