我正在尝试将Material design lite与 Ember.js 应用程序一起使用,并让表单以某种方式工作。但是,当用户从一个页面导航到包含表单或输入的另一个页面时,输入的行为似乎与预期不同。举个例子,当页面第一次加载到主页时,输入工作正常,但是当我们在登录和主页之间切换时,输入回退到基本表单和材料设计动画丢失。
不确定此问题是否与 Ember.js 或 Material 设计有关,但我们将不胜感激。
我正在尝试将Material design lite与 Ember.js 应用程序一起使用,并让表单以某种方式工作。但是,当用户从一个页面导航到包含表单或输入的另一个页面时,输入的行为似乎与预期不同。举个例子,当页面第一次加载到主页时,输入工作正常,但是当我们在登录和主页之间切换时,输入回退到基本表单和材料设计动画丢失。
不确定此问题是否与 Ember.js 或 Material 设计有关,但我们将不胜感激。
MDL 要求对元素进行初始化以获得特殊效果,例如带有波纹的按钮或动画输入框。它们在页面加载时默认初始化,但视图或组件插入的元素不会被初始化。最简单的方法是在didInsertElement
.
更通用的方法是使用 mixin 为您处理此问题,如:
// mixins/mdl-button.js
export default Ember.Mixin.create() {
initializeMdlButtons: function() {
var buttons = this.get('element').querySelectorAll('.mdl-button');
[].forEach.call(buttons, button => componentHandler.upgradeElement(button));
}.on('didInsertElement')
然后在您的组件中使用按钮
import MdlButton from 'app/mixins/mdl-button';
export default Ember.Component.extend(MdlButton, {
...
});
或者,您可以将其应用于所有组件
Ember.Component.reopen(MdlButton);
或者您可以只在 didInsertElement 上执行 componentHandler.upgradeDom()。根据他们的文档
在现有 DOM 中搜索我们组件类型的元素并升级它们 * 如果它们尚未升级。
initializeItems: function () {
componentHandler.upgradeDom();
}.on('didInsertElement')
您将需要创建处理程序来为每个 MDL 组件初始化所需的 JS。你有两种可能:
我使用了 2。这就是为什么我专门编写了一个 ember-addon 来从 MDL 中创建 ember 组件。
这很简单。
ember install ember-mdl
演示/文档: http: //peec.github.io/ember-mdl/
实现示例在虚拟应用程序中
感谢@torazaburo 的建议。我必须修改 mixin 才能让它工作。就我而言,我有文本字段输入,需要修改混合。如果有人仍然需要,这是我的解决方案。
// app/mixins/textfield-support.js
import Ember from 'ember';
export default Ember.Mixin.create({
initializeMdlTextfield: function() {
componentHandler.upgradeElement(this.get('element'), 'MaterialTextfield');
}.on('didInsertElement')
});
然后我们可以在我们的组件中扩展混合,如下所示。
// app/components/mdl-textfield-input.js
import Ember from 'ember';
import layout from '../templates/components/mdl-textfield-input';
import mdlTextfield from '../mixins/textfield-support';
export default Ember.Component.extend(mdlTextfield, {
tagName : 'div',
attributeBindings : ['disabled', 'type', 'name' ],
hasFloatingLabel : false,
containerClassNames : '',
labelText : null,
classNames : ['mdl-textfield', 'mdl-js-textfield'],
classNameBindings: [
'hasFloatingLabel:mdl-textfield--floating-label',
'containerClassNames'
],
layout
});
组件模板看起来像这样。
// app/templates/components/mdl-textfield-input.hbs
{{yield}}
{{input id=name value=value type=type disabled=disable classNames="mdl-textfield__input"}}
<label class="mdl-textfield__label" for={{name}}>{{labelText}}</label>
<span class="mdl-textfield__error">{{error}}</span>
并按如下方式使用此组件。
{{mdl-textfield-input
name='username'
value=model.username
labelText='Username'
hasFloatingLabel=true
type='text'
containerClassNames ='mdl-cell--12-col'
}}