AngularJS 和 Shadow DOM

标签 angularjs shadow-dom

我正在开发一个网络组件表单。 我在使用 angularjs bootsrap 时遇到了麻烦。

我正在使用 form.createdCallback <form> and <input, textarea etc> 动态创建自定义元素并添加 ng-app="", ng-controller=""属性。 后来我用 template.createShadowRoot() 封装它

我使用document.addEventListener('DOMContentLoaded', function(){angular.bootstrap(document, ['mform'])}) ,但这样做不会执行我的 Angular 应用程序中的任何内容...

所以,我尝试删除行 template.createShadowRoot()并且 Angular 执行一切都很好...所以我得出的结论是问题是 Angular 没有在 Shadow dom 内编译。

有什么技巧或方法可以做到这一点吗?

最佳答案

我不确定这是否真的回答了你的问题,但我能够让 Shadow DOM 在 Angular 1.x 中工作。请注意,如果您进行 CSS 封装,那么这只适用于原生支持 Shadow DOM 的浏览器,因为 Polyfill 无法执行相同的操作。

我使用 $compile 创建 Shadow DOM 的内容并将其绑定(bind)回指令中。

这是我的代码示例:

<!DOCTYPE html>
<html ng-app="app">
  <head>
    <meta charset="utf-8">
    <title>Angular 1.x ShadowDOM example</title>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular.min.js"></script>
    <script>
    var app = angular.module('app', []);

    app.controller('myElController', ($scope) => {

    });

    var template = `
    <style>
    :host {
      left: 50%;
      position: fixed;
      top: 50%;
      transform: translate(-50%,-50%);
      border: 1px solid black;
      box-shadow: 4px 4px 4px rgba(0,0,0,.4);
      display: inline-block;
      padding: 6px 12px;
    }

    h3 {
      border-bottom: 1px solid #999;
      margin: 0 -12px 8px;
      padding: 0 12px 8px;
    }

    p {
      margin: 0;
    }
    </style>
        <h3>{{title}}</h3>
      <p>{{info}}</p>
    `;

    app.directive('myEl', ($compile) => {
        return {
          "restrict": "E",
          "controller": "myElController",
          "template": '',
          "scope": {
            "title": "@",
            "info": "@"
          },
          "link": function($scope, $element) {
            console.log('here');
            $scope.shadowRoot = $element[0].attachShadow({mode:'open'});
            $scope.shadowRoot.innerHTML = template;
            $compile($scope.shadowRoot)($scope);
          }
        };
    });
    </script>
  </head>
  <body>
    <div>
      <my-el title="This is a title" info="This is the info of the element"></my-el>
    </div>
    <div class="shell">
      <h3>Outside title (H3)</h3>
      <p>Outside content (P)</p>
    </div>
  </body>
</html>

关于AngularJS 和 Shadow DOM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37491962/

相关文章:

angularjs - 如何在 AmCharts 中访问嵌套的 Json 数据

angularjs - 将日期值绑定(bind)到 Angular 剑道日期选择器中的 ng-model

javascript - 访问影子 DOM 中的元素

css - Shadow Dom::content css 选择器优先级?

javascript - Angular + requirejs : quick refreshing pages cause page stop working in chrome

javascript - 使用 templateUrl 更新指令元素值

Angularjs:$http 响应设置 cookie 不适用于 CORS

javascript - 样式化插入到 Shadow DOM 中的内容

dart - 如何在 polymer 自定义元素中渲染阴影 DOM

Java Selenium : Switch to iframe inside shadow-root open inside webview