如何在聚合物中强制执行所需的纸-无线电基团
How to enforce required paper-radio-group in Polymer?
在paper-radio-group
上执行require
检查的最佳方法是什么?我看到另一个使用fallback-selection
的问题和答案,在这里,但我想强迫用户选择"是"或"否"。
<paper-radio-group selected="" attr-for-selected="value" data-required="{{question.required}}">
<paper-radio-button name="{{question.id}}" value="yes">Yes</paper-radio-button>
<paper-radio-button name="{{question.id}}" value="no">No</paper-radio-button>
</paper-radio-group>
我能想到的唯一方法是在最后运行一个检查器函数来检查它。
checkAnswers: function() {
var currentGroup = document.querySelector('.question-group.iron-selected'),
answers = Array.prototype.slice.call(currentGroup.querySelectorAll('paper-input, paper-radio-group'));
return answers.every(function(a) {
return a.validate && a.validate() || a.nodeName === 'PAPER-RADIO-GROUP' && a.dataRequired && a.selected;
});;
},
上面的工作,但我仍然需要找出一种方法来显示错误给用户。是否有更好的方法来验证所需的paper-radio-group
?
我假设您在submit
处理程序中调用checkAnswers()
。注意,<iron-form>.validate()
执行类似的逻辑,只是它只对具有IronFormElementBehavior
和required
属性的子节点调用validate()
。如果您将required
应用于适当的输入元素,则可以将checkAnswers()
替换为this.$.form.validate()
。
submit: function() {
//var isValid = checkAnswers();
var isValid = this.$.form.validate();
}
<paper-radio-group>
实际上没有IronFormElementBehavior
,所以它的required
属性没有作用。您可以通过使用您自己的自定义元素包装<paper-radio-group>
来解决这个问题,该元素可以适当地添加行为:
<dom-module id="radio-group">
<template>
<paper-radio-group id="group"
attr-for-selected="{{attrForSelected}}"
selected="{{selected}}">
<content></content>
</paper-radio-group>
</template>
<script>
Polymer({
is: 'radio-group',
behaviors: [
Polymer.IronFormElementBehavior
],
get selectedItem() {
return this.$.group.selectedItem;
},
validate: function() {
return this.selectedItem != null;
}
});
</script>
</dom-module>
然后,将<paper-radio-group>
替换为<radio-group>
:
<radio-group attr-for-selected="value" required>
<paper-radio-button value="yes">Yes</paper-radio-button>
<paper-radio-button value="no">No</paper-radio-button>
</radio-group>
<head>
<base href="https://polygit.org/polymer+1.11.0/components/">
<script src="webcomponentsjs/webcomponents-lite.js"></script>
<link rel="import" href="polymer/polymer.html">
<link rel="import" href="iron-form/iron-form.html">
<link rel="import" href="iron-label/iron-label.html">
<link rel="import" href="paper-radio-group/paper-radio-group.html">
<link rel="import" href="paper-radio-button/paper-radio-button.html">
<link rel="import" href="paper-button/paper-button.html">
</head>
<body>
<x-form></x-form>
<dom-module id="x-form">
<template>
<iron-form id="form">
<form action="">
<iron-label>Do you agree?
<radio-group name="answerswers" id="answerswer" attr-for-selected="value" required>
<paper-radio-button name="answerswerY" value="yes">Yes</paper-radio-button>
<paper-radio-button name="answerswerN" value="no">No</paper-radio-button>
</radio-group>
</iron-label>
<div>
<paper-button on-click="submit">Submit</paper-button>
</div>
</form>
</iron-form>
</template>
<script>
HTMLImports.whenReady(function() {
Polymer({
is: 'x-form',
submit: function() {
console.log('valid', this.$.form.validate(),
'answer', this.$.answer.selectedItem && this.$.answer.selectedItem.value);
}
});
});
</script>
</dom-module>
<dom-module id="radio-group">
<template>
<paper-radio-group id="group" attr-for-selected="{{attrForSelected}}" selected="{{selected}}">
<content></content>
</paper-radio-group>
</template>
<script>
HTMLImports.whenReady(function() {
Polymer({
is: 'radio-group',
behaviors: [
Polymer.IronFormElementBehavior
],
get selectedItem() {
return this.$.group.selectedItem;
},
validate: function() {
return this.selectedItem != null;
}
});
});
</script>
</dom-module>
</body>
codepen
对于像Yes/No这样的二进制输入,使用<paper-checkbox>
可能更合适,因为它需要更少的代码并简化了该输入的形式。
<head>
<base href="https://polygit.org/polymer+1.11.0/components/">
<script src="webcomponentsjs/webcomponents-lite.js"></script>
<link rel="import" href="polymer/polymer.html">
<link rel="import" href="iron-form/iron-form.html">
<link rel="import" href="paper-checkbox/paper-checkbox.html">
<link rel="import" href="paper-button/paper-button.html">
</head>
<body>
<x-form></x-form>
<dom-module id="x-form">
<template>
<iron-form id="form">
<form action="">
<paper-checkbox id="answerswer" required>I agree</paper-checkbox>
<div>
<paper-button on-click="submit">Submit</paper-button>
</div>
</form>
</iron-form>
</template>
<script>
HTMLImports.whenReady(function() {
Polymer({
is: 'x-form',
submit: function() {
console.log('valid', this.$.form.validate(),
'answer', this.$.answer.checked);
}
});
});
</script>
</dom-module>
</body>
codepen
相关文章:
- 用于搜索的聚合物嵌套绑定
- 聚合物0.5.5:核心列表中的条件模板和/或模板动态参考
- Rubaxa可与聚合物进行排序/拖放不起作用,具体取决于显示器:
- 角度无线电按钮ng模型不起作用
- 如何在模板聚合物中使用元素函数
- 聚合物dom重复问题
- 聚合物是一个框架而不是一个库.如何模块化地使用web组件
- 聚合物铁形式验证至少选中一个复选框
- 角度 ng 检查不适用于无线电 - 2
- 无线电输入更改的jQuery事件未启动
- 玻璃鱼服务器和聚合物
- 聚合物:在不同的视图模型中多次使用元素
- 聚合物-dom重复的起始指数
- 聚合物绑定条件属性和求值属性
- 如何动态创建聚合物元素
- AngularJS+IE 11+聚合物=ng模型未更新
- 如何使用javascript独立地为聚合物自定义元素的每个实例的lightdom设置样式
- 通过单击链接(兄弟姐妹?)从无线电输入中获取id
- 聚合物1.0纸无线电基团条件
- 如何在聚合物中强制执行所需的纸-无线电基团