6

我将 material-bootstrap 脚本包含到我的 Angular 项目的 index.html 中,但它们需要手动重新包含在视图中才能工作。

这很奇怪,因为插入到 Angular 中的所有其他脚本都不会发生这种情况。

索引.html

<script src="bower_components/bootstrap-material-design/scripts/material.js"></script>
<script src="bower_components/bootstrap-material-design/scripts/ripples.js"></script>

我还注意到 material-bootstrap 不能很好地与 Grunt 和 Bower 配合使用,并且往往会在构建时自行删除(因此手册包含在页面底部)。

这些已知的错误是 Material-boostrap 和 Angular/Bower/Grunt 还是我做错了什么?

如果您还需要什么,请告诉我!

编辑

bower.json 中的依赖项

"dependencies": {
    "angular": "~1.3.0",
    "json3": "~3.3.1",
    "es5-shim": "~3.1.0",
    "bootstrap": "~3.2.0",
    "angular-resource": "~1.3.0",
    "angular-cookies": "~1.3.0",
    "angular-sanitize": "~1.3.0",
    "angular-animate": "~1.3.0",
    "angular-touch": "~1.3.0",
    "angular-route": "~1.3.0",
    "bootstrap-material-design": "*",
    "jsjws": "~3.0.2",
    "angular-ui-router": "0.2.11"
  }
4

1 回答 1

2

问题在于 bootstrap 的材料设计插件通过对 DOM 应用转换来工作,并且它不是为自动与 Angular 等框架一起工作而设计的。

材质框架要求您声明如下脚本来初始化组件:

<script>
  $.material.init();
</script>

这意味着对象在页面加载时被“物化”。由于 Angular.js 应用程序是单页的,因此样式仅应用于页面中已经存在的元素(尝试添加新组件,也不要使用视图:您应该得到相同的结果)。

如果您在视图页面中包含脚本,您将获得所需的行为(不是完全功能),因为 Angular.js 在后台加载视图页面,因为它是一个普通页面,然后获取 dom 的内容并合并视图树与单页树。

我建议您在加载视图后尝试添加对 $.material.init() 的调用。由于涟漪库,多次调用 init 时要小心。如此处所述(https://github.com/FezVrasta/bootstrap-material-design/issues/184),您应该避免再次附加事件处理程序的涟漪:

// add the "done" boolean inside ripples.js
window.ripples = { 
    init: function(withRipple) { /*bla bla*/ },
    done: false
}

// Then, where you run ripples.init... (aka, material.js, or maybe directly inside the init function of ripples.js)
if (!window.ripples.done) { 
  ripples.init();
  ripples.done = true;
}
于 2014-12-16T23:38:03.813 回答