背景:我们的应用程序总是作为一个整体打包,但通过用户访问一些服务器端操作可能会受到限制.我们知道应用程序启动时允许的操作.我们现在想要隐藏他无法访问的用户的所有视图(面板,按钮等).
为此,我们编写了一个可以应用于任何组件的插件.但问题出现了:
以下是我们尝试针对插件主机运行的内容:
if (cmp['setVisible']) cmp.setVisible(false); else cmp.hidden = true;
if (cmp['disable']) cmp.disable(); else cmp.disabled = true;
cmp.on('beforerender', function() { return false; })
Run Code Online (Sandbox Code Playgroud)
首先我们认为越早越好.所以我们试图在插件的构建时运行它.但这是不可能的,因为(主机)的监听器似乎尚未准备好(组件试图触发隐藏事件).所以我们将它移动到init插件的方法中,该方法不会引发错误但只是部分工作.只有beforerender事件真正应用但它只中止了孩子的渲染.所以我们最终得到了一个破碎的组件(边框在那里而内容没有).如果我们评论了活动注册,主持人保持不变.我们还测试了仅使用hidden:true和disabled:true没有运气的使用.
那么我们如何才能以正确的方式阻止组件的渲染呢?
编辑:
该组件应标记为已禁用和隐藏,因为我们无法阻止组件的创建.我从我的同事那里得到的剪辑是错的,所以工作的召唤setVisible(false),我们disable()也猜.但是组件得到了平滑的渲染,我们似乎无法否定这一点而不会得到一半的渲染组件.
回答@AlexTokarev
我尝试过@AlexTokarev建议的内容.为此,我将以下行添加到Plugin-Constructor中
cmp.hidden = true;
cmp.autoShow = false; // I know this may do nothing for non floating but I added it anyway
cmp.autoRender = true;
Run Code Online (Sandbox Code Playgroud)
根据调试我知道设置很早就会应用(在Ext.AbstractComponent.constructor中),但我仍然以隐藏和渲染的组件结束.

@sbgoran的评论
在一个Testcase中,我们使用列布局,其中所有容器都从同一个类扩展.一旦我将我们的插件(将beforerender事件返回false配置)添加到其中一个扩展容器(插件直接添加到类定义(作为ptype)),此列中的所有容器看起来都已损坏(仅渲染边框并且内容是左上角的一个小灰框.)因此,当只有一个子项取消渲染时,中止渲染会影响列的所有子项.
**示例代码**
首先,我想要注意的是,我们正在寻找一种方法来实现这一点,因为我们知道ExtJS中的渲染是一回事.我可以要求设置一个演示,但我认为这不会那么容易,因为我们使用的Ext.app.portal.Panel是失败的例子.但该插件应该适用于任何类型的组件.首先,我将添加一些演示代码:
我们有一个视图放置在具有边框布局的Viwport中 …
据我所知this,在回调中使用赋值变量,其中this范围可能会发生变化.但是通过ExtJS源我发现它在各种函数中使用但并非总是如此.那么我是否有任何理由将其分配this给范围下的局部变量,或者ExtJS源是否正在与不同的开发人员风格进行斗争?
这是关于版本4.2.2我们有这样的图表
var store = Ext.create('Ext.data.JsonStore', {
fields: ['name', 'data'],
data: [
{ 'name': 'metric one', 'data':10 },
{ 'name': 'metric two', 'data':27 }
]
});
Ext.create('Ext.chart.Chart', {
renderTo: Ext.getBody(),
width: 500,
height: 300,
animate: true,
store: store,
legend: {
position: 'right'
},
axes: [
{
type: 'Numeric',
position: 'left',
fields: ['data'],
label: {
renderer: Ext.util.Format.numberRenderer('0,0')
},
title: 'Sample Values',
grid: true,
minimum: 0
},
{
type: 'Category',
position: 'bottom',
fields: ['name'],
title: 'Sample Metrics'
}
],
series: [
{
type: …Run Code Online (Sandbox Code Playgroud) 如何在 Ext.applcation 的启动方法中向视口添加一个加载掩码,当显示时它也将覆盖像窗口这样的浮动组件?
目前遮罩工作但不覆盖任何打开的窗口。
我们如何滚动到网格中定义的记录(记录或索引)?
使用缓冲渲染器,通过调用以下内容非常简单:
grid.view.bufferedRenderer.scrollTo(0, false, callback, scope);
Run Code Online (Sandbox Code Playgroud)
但是如何使用默认渲染器完成此操作?
我很好奇idProperty模型中的一个实现,读者中的一个idParam实现,然后是代理和clientIdProperty模型的实现
我们如何以正确的方式使用它们?
我们需要将十进制值插入XML文档(由XML编写器完成),该文档工作正常.首先我们使用XmlConvert.ToString(myDecimalValue)哪个打印四位数的值.现在我们被迫总是使用两位数,我们试图改变这一点,但到目前为止没有运气.
首先我们放弃了使用,XmlConvert因为我们发现没有超载允许我们格式化小数,所以我们尝试myDecimalValue.ToString("0.00")只打印两个数字,但替换了.一个,在我们的情况下无效的.
那么我们如何将十进制格式化为类似25000.00m字符串25000.00?(舍入无关紧要,因为值永远不会超过两位数)
编辑
decimal m_nAmt;
public decimal Amount
{
get
{
return m_nAmt;
}
set
{
if ((value < 0M) || (value > 999999999.99M))
{
throw new ArgumentOutOfRangeException();
}
if (SepaUtil.DecimalPlaces(value) > 2)
{
throw new ArgumentException();
}
m_nAmt = value;
}
}
Run Code Online (Sandbox Code Playgroud)
写在哪里
// the original method
XmlConvert.ToString(m_nAmt);
Run Code Online (Sandbox Code Playgroud)
两种方法都是同一类的成员;
以下是写入Xml文件的值的示例
<InstdAmt Ccy="EUR">3360.0000</InstdAmt>
Run Code Online (Sandbox Code Playgroud)
编辑2
编写节点的示例.我使用立即窗口来获取ControlSumProperty(System.Decimal)的当前值和写入的值XmlConvert.结果是XmlConvert写入四个小数位,虽然我XmlConvert在LINQPad中使用十进制变量时无法确认.一个区别是这个库使用.net 2.0 …