javascript - AngularJS : Scope access between directives and transcluded directives

标签 javascript angularjs angularjs-directive angularjs-scope

我构建了一个模块化形式的小型演示,其中包含单独的输入指令。 它还可以预览绑定(bind)到相同 Controller 和范围的表单值。

导致问题的输入指令是嵌入到表单内的输入:

<mailer-form>
  <mailer-input form="mail" model="email">
    <input class="form-control" placeholder="Email" ng-model="mail.email">
  </mailer-input>
</mailer-form>

<mailer-preview></mailer-preview>

您可以在这里查看:

http://plnkr.co/edit/0FuzfOFFDN5XcNyZcpBv

问题是表单模板中的 ng-models 更新了父范围, 而嵌入的输入则不然。这就是为什么第一个电子邮件输入不起作用 其余的都是如此。

如何使嵌入的指令双向绑定(bind)?

谢谢!

最佳答案

ng-transclude 指令始终为嵌入的内容创建一个新的子作用域。

此处有一个请求 (https://github.com/angular/angular.js/issues/5489),要求不要创建新范围,但尚未实现。

如果您希望嵌入的内容与容器具有相同的范围,您可以在 link() 中使用 transcludeFn (如下面的代码片段所示)而不是 ng-transclude。

link: function(scope, element, attributes, controllers, transcludeFn){
  transcludeFn(scope, function(nodes) {
    element.find('.transclude-here').append(nodes);
  })
}

并替换它们

<div ng-transclude></div>

<div class="transclude-here"></div>

有关完整示例,请参阅 http://plnkr.co/edit/WYCOxC9xBIOTUWPs2iAq?p=preview

编辑:如果您希望在多个地方实现此行为,您可以编写自己的自定义版本的 ng-transclude,如下所示:

app.directive('myTransclude', function () {
  return {
    restrict: 'EAC',
    link: function(scope, element, attrs, controllers, transcludeFn) {
      transcludeFn(scope, function(nodes) {
        element.empty();
        element.append(nodes);
      });
    }
  };
});

在 html 模板中:

 <div my-transclude></div>

关于javascript - AngularJS : Scope access between directives and transcluded directives,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24764387/

相关文章:

javascript - 将回调与 Google Fusion Tables 一起使用

javascript - 带有服务器端处理 Ajax URL 的 Angular 数据表在第一次后格式不正确

javascript - 通过 element.find 从父级检索子指令范围

javascript - Vue 和 Vuex : Handling dependent computed properties

javascript - $(class).click() 不起作用

javascript - 从 iPhone 网络应用程序检查在线状态

angularjs - 如何在 AngularJS 指令范围中设置默认值?

angularjs - angular.js 元素没有方法 querySelector

javascript - 将过滤后的集合传递给 Angular 指令会导致异常

javascript - AngularJS 指令添加其他不起作用的指令