Ember CLI:自定义输入助手
Ember CLI: custom input helper
我正在尝试使用 UrlField 扩展 Ember 的 TextField,以便如果有人忘记包含 http://
,它会为他们完成。
这是我的观点:
views/input-url.js
import Ember from 'ember';
export default Ember.TextField.extend({
type: 'url',
didInsertElement: function() {
this._super.apply(this, arguments);
this.formatValue();
},
onValueChange: function() {
this.formatValue();
}.observes('value'),
formatValue: function() {
var pattern = /^https{0,1}:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+/g;
if (pattern.test(this.get('value')))
return;
if (!pattern.test('http://' + this.get('value')))
return;
this.set('value', 'http://' + this.get('value'));
}
});
如果我像这样在我的模板中使用它,它工作正常:
{{view "input-url" value=url}}
我更喜欢使用自定义视图助手,所以我创建了这个(遵循本页底部的指南:http://guides.emberjs.com/v1.11.0/templates/writing-helpers/):
helpers/input-url.js
import Ember from 'ember';
import InputUrl from '../views/input-url';
export default Ember.Handlebars.makeBoundHelper(InputUrl);
现在尝试在我的模板中呈现它不起作用:
{{input-url value=url}}
我也尝试过不同的排列组合,包括指南 Ember.Handlebars.makeBoundHelper('input-url', InputUrl);
中显示的内容(会引发错误),但我似乎无法显示我的输入字段。我做错了什么?
不确定您的视图助手有什么问题,但有一个更简单的解决方案:利用 Ember.Textfield 是一个组件这一事实。 http://emberjs.com/api/classes/Ember.TextField.html
只需将 views/input-url.js 移动到 components/input-url.js 并删除您的视图助手。
那么 {{input-url value=url}}
应该会自动工作。
如果您想使用帮助程序执行此操作,则不能扩展 Ember.TextField because extends Ember.Component 并且不是 Handlebars 帮助程序。
使用帮助程序执行此操作的方法实际上会更简单。由于您使用的是 Ember-CLI,因此您可以使用命令 ember g helper input-url
创建一个名为 "input-url" 的助手,您唯一需要的代码是formatValue()
函数中的代码:
helpers/input-url.js
// define patter globally so it's not recreated each time the function is called
var pattern = /^https{0,1}:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+/g;
export function inputUrl(value) {
if (pattern.test(value)) {
return value;
}
if (!pattern.test('http://' + value)) {
return value;
}
return 'http://' + value;
};
export default Ember.Handlebars.makeBoundHelper(inputUrl);
您可以像这样使用它:
{{input-url PASS_YOUR_URL_HERE}}
您传递的值将是助手中 value
变量的值。
您也可以创建一个组件,正如 @Gaurav 所建议的那样,使用上面的确切代码,就在 components/input-url.js 而不是删除助手,因为它不再需要了。如果您希望它显示带有单个车把表达式的 value
,您还必须编辑组件的相应模板:
模板/components/input-url.hbs
{{value}}
组件的用法为:
{{input-url value=PASS_YOUR_URL_HERE}}
我正在尝试使用 UrlField 扩展 Ember 的 TextField,以便如果有人忘记包含 http://
,它会为他们完成。
这是我的观点:
views/input-url.js
import Ember from 'ember';
export default Ember.TextField.extend({
type: 'url',
didInsertElement: function() {
this._super.apply(this, arguments);
this.formatValue();
},
onValueChange: function() {
this.formatValue();
}.observes('value'),
formatValue: function() {
var pattern = /^https{0,1}:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+/g;
if (pattern.test(this.get('value')))
return;
if (!pattern.test('http://' + this.get('value')))
return;
this.set('value', 'http://' + this.get('value'));
}
});
如果我像这样在我的模板中使用它,它工作正常:
{{view "input-url" value=url}}
我更喜欢使用自定义视图助手,所以我创建了这个(遵循本页底部的指南:http://guides.emberjs.com/v1.11.0/templates/writing-helpers/):
helpers/input-url.js
import Ember from 'ember';
import InputUrl from '../views/input-url';
export default Ember.Handlebars.makeBoundHelper(InputUrl);
现在尝试在我的模板中呈现它不起作用:
{{input-url value=url}}
我也尝试过不同的排列组合,包括指南 Ember.Handlebars.makeBoundHelper('input-url', InputUrl);
中显示的内容(会引发错误),但我似乎无法显示我的输入字段。我做错了什么?
不确定您的视图助手有什么问题,但有一个更简单的解决方案:利用 Ember.Textfield 是一个组件这一事实。 http://emberjs.com/api/classes/Ember.TextField.html
只需将 views/input-url.js 移动到 components/input-url.js 并删除您的视图助手。
那么 {{input-url value=url}}
应该会自动工作。
如果您想使用帮助程序执行此操作,则不能扩展 Ember.TextField because extends Ember.Component 并且不是 Handlebars 帮助程序。
使用帮助程序执行此操作的方法实际上会更简单。由于您使用的是 Ember-CLI,因此您可以使用命令 ember g helper input-url
创建一个名为 "input-url" 的助手,您唯一需要的代码是formatValue()
函数中的代码:
helpers/input-url.js
// define patter globally so it's not recreated each time the function is called
var pattern = /^https{0,1}:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+/g;
export function inputUrl(value) {
if (pattern.test(value)) {
return value;
}
if (!pattern.test('http://' + value)) {
return value;
}
return 'http://' + value;
};
export default Ember.Handlebars.makeBoundHelper(inputUrl);
您可以像这样使用它:
{{input-url PASS_YOUR_URL_HERE}}
您传递的值将是助手中 value
变量的值。
您也可以创建一个组件,正如 @Gaurav 所建议的那样,使用上面的确切代码,就在 components/input-url.js 而不是删除助手,因为它不再需要了。如果您希望它显示带有单个车把表达式的 value
,您还必须编辑组件的相应模板:
模板/components/input-url.hbs
{{value}}
组件的用法为:
{{input-url value=PASS_YOUR_URL_HERE}}