如何获得一个自定义ExtJS组件来渲染一些基于绑定值的html
How to get a Custom ExtJS Component to render some html based on a bound value
我正在尝试获得一个自定义的extjs组件,以基于绑定到它的真/假值来呈现绿色支票或红色x图像。
以前的开发人员已经为呈现自定义标签/自定义按钮编写了一些其他控件,我正试图将这些控件作为控件的基础,但我运气不佳。
我希望能够在如下视图中使用它,其中"recordIsValid"是我的模型中属性的名称。(如果我删除了xtype:它只是呈现为真/假)
{
"xtype": "booldisplayfield",
"name": "recordIsValid"
}
这是我目前所掌握的,但ExtJS对我来说相当陌生
Ext.define('MyApp.view.ux.form.BoolDisplayField', {
extend: 'Ext.Component',
alias : 'widget.booldisplayfield',
renderTpl : '<img src="{value}" />',
autoEl: 'img',
config: {
value: ''
},
initComponent: function () {
var me = this;
me.callParent(arguments);
this.renderData = {
value: this.getValue()
};
},
getValue: function () {
return this.value;
},
setValue: function (v) {
if(v){
this.value = "/Images/booltrue.png";
}else{
this.value = "/Images/boolfalse.png";
}
return this;
}
});
上面的大部分内容我都是从以前的自定义链接按钮实现中获得的。我假设当recordIsValid
的模型值绑定到控件时会调用setValue
。然后,根据这是真是假,它将用正确的图像覆盖控件的value属性的设置。
然后在initComponent中,它将通过调用getValue
来设置renderData value
,并将其注入到renderTpl
字符串中。
如有任何帮助,我们将不胜感激。
您应该使用tpl
选项,而不是renderTpl
选项。后者用于呈现组件结构,而不是其内容。这样,您就可以使用update
方法来更新组件。
您还需要在组件的构造函数中调用initConfig
,以便应用初始状态。
最后,出于语义原因,我建议使用applyValue
而不是setValue
,并保留getValue/setValue的布尔值。
Ext.define('MyApp.view.ux.form.BoolDisplayField', {
extend: 'Ext.Component',
alias : 'widget.booldisplayfield',
tpl: '<img src="{src}" />',
config: {
// I think you should keep the true value in there
// (in order for setValue/getValue to yield the expected
// result)
value: false
},
constructor: function(config) {
// will trigger applyValue
this.initConfig(config);
this.callParent(arguments);
},
// You can do this in setValue, but since you're using
// a config option (for value), it is semantically more
// appropriate to use applyValue. setValue & getValue
// will be generated anyway.
applyValue: function(v) {
if (v) {
this.update({
src: "/Images/booltrue.png"
});
}else{
this.update({
src: "/Images/boolfalse.png"
});
}
return v;
}
});
这样,您就可以在创建时或以后使用setValue
设置您的值。
// Initial value
var c = Ext.create('MyApp.view.ux.form.BoolDisplayField', {
renderTo: Ext.getBody()
,value: false
});
// ... that you can change later
c.setValue(true);
然而,您将无法删除这个组件,因为它处于Ext形式,并将其作为一个成熟的字段。也就是说,它的值不会被设置、检索等。为此,您必须使用Ext.form.field.Field
mixin。请参阅另一个问题,了解有关该主题的详细讨论。
- 在将绑定应用于控制器之后,是否会发出Angular$scope事件
- 为什么针对工厂的Angular数据绑定只适用于函数
- 将敲除绑定应用于模板,并将结果作为字符串获取
- jQuery.bind或.on习惯于绑定到新记录
- 与 Angular 1.5 的单向数据绑定类似于双向工作
- 取消绑定/绑定单击jquery selectbox插件
- 如何使用 KNOCKOUTJS 模板绑定绑定依赖模板
- 绑定函数仅适用于最后一个元素
- KNOCKOUTJS 不能将绑定多次应用于同一元素
- KnockoutJs v2.3.0 :“不能多次将绑定应用于同一元素”
- 绑定数据列表后,将 css 样式重新应用于视图的一部分
- 挖空 + MVC - 不能将绑定多次应用于同一元素
- 创建一个依赖于可观察量“树”的 Knockout 绑定处理程序
- 敲除绑定仅适用于单向
- PHP 相当于 JavaScript 绑定
- Knockoutjs:同时使用单击和选中绑定时绑定评估的顺序
- Knockout:在创建自定义绑定后,绑定未应用于页面的一部分
- 相当于后期静态绑定的JavaScript
- 使用敲除foreach绑定绑定方法名称
- 如何使用调用、应用和绑定在Ruby中的对象上强制使用类似于JavaScript的方法