6

我有某种形式的指令。通常这就是我所需要的,但有时我需要添加更多输入字段。所以我尝试为此使用嵌入,但它不起作用。

我创建了一个 plunker 来说明这一点:http ://plnkr.co/edit/zNOK3SJFXE1PxsvUvPBQ?p=preview

指令是一个简单的表单,带有输入字段、嵌入和一个帮助测试它的按钮(不重要部分省略):

scope: {
},
transclude: 'element',
template: 
  '<form name="myForm">' +
  '<input type="text" ng-model="data.inDirective"></input>' +
  '<div ng-transclude></div>' +
  '<button ng-click="showData()">show data</button>' +
  '</form>'

在这里它与嵌入一起使用:

<form-as-directive>
  <input type="text" ng-model="data.inTransclude"></input>
</form-as-directive>

我可以在嵌入中以某种方式使用指令的范围吗?

4

2 回答 2

7

如果您需要将嵌入的 html 中的控件绑定到指令的(隔离)范围,则必须使用链接函数的 transcludeFn 参数“手动”(不使用 ng-transclude)进行嵌入。此功能允许您更改嵌入的范围。

scope: {
},
transclude: 'element',
replace: true,
template: 
    '<form name="myForm">' +
    '<input type="text" ng-model="data.inDirective"></input>' +
    '<div class="fields"></div>' +
    '<button ng-click="showData()">show data</button>' +
    '</form>',
link: function (scope, elem, attrs, ctrl, transcludeFn) {
    // "scope" here is the directive's isolate scope 
    elem.find('.fields').append(transcludeFn(scope, function () {}));
}

否则,嵌入会自动绑定到父(控制器)范围的(新)子范围,以便访问该父范围的属性(通过继承)。

于 2014-05-23T15:55:16.000 回答
1

好像$$nextSibling是你需要的:

 scope.$$nextSibling.data.inTransclude

这里

当一个转入和隔离范围都存在时,隔离范围属性 $$nextSibling 将引用转入范围。

Plunk:http ://plnkr.co/edit/z2Bmfx?p=preview

于 2013-10-10T16:55:20.513 回答