【问题标题】:Bootstrap material design not working properly with dynamic angular viewsBootstrap 材料设计不适用于动态角度视图
【发布时间】:2014-10-05 19:25:24
【问题描述】:

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

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

index.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"
  }

【问题讨论】:

  • 我不知道这项技术,但脚本的引用通常应该在共享视图中,例如 PageLayout,其中嵌入了其他视图。
  • 嗨,是的,它在共享视图中。基本上,Angular 中的 index.html 是单个页面,视图是在该页面中加载的。索引几乎充当包装器,因此加载到其中的所有脚本都应该在其子视图中工作
  • 可能是一个愚蠢的问题,但您确定您的 bower.json 中存在材料引导参考吗?
  • 是的 :) 我将在上面发布我的依赖项的片段!
  • 可能不是你的问题的解决方案,但是必须在material.js之前包含ripples.js。我们还重构了整个主题,现在它与 bower 一起工作得更好。试一试。

标签: javascript angularjs twitter-bootstrap bower bootstrap-material-design


【解决方案1】:

问题在于 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;
}

【讨论】:

  • 我试过了,效果很好。但感觉很糟糕,因为我的代码看起来又丑又脏。
猜你喜欢
  • 2015-07-28
  • 2015-11-16
  • 2019-07-29
  • 1970-01-01
  • 2015-10-16
  • 1970-01-01
  • 1970-01-01
  • 2019-02-28
  • 2018-05-11
相关资源
最近更新 更多