Javascript 记录时更新绑定到公式的ExtJS按钮';s数据更改
我在ExtJS5.1.0.107中有一个按钮和一个树面板。公式确定按钮是否已禁用,并且该公式已绑定到树面板的选择 仅当所选节点是分支且node.get(“ID”)具有值时,才应启用该按钮 当我在树中选择一个节点时,下面的代码起作用 我的树和按钮:Javascript 记录时更新绑定到公式的ExtJS按钮';s数据更改,javascript,extjs,extjs5,Javascript,Extjs,Extjs5,我在ExtJS5.1.0.107中有一个按钮和一个树面板。公式确定按钮是否已禁用,并且该公式已绑定到树面板的选择 仅当所选节点是分支且node.get(“ID”)具有值时,才应启用该按钮 当我在树中选择一个节点时,下面的代码起作用 我的树和按钮: { xtype: 'treepanel', bind: { selection: '{selectedNode}' }, ... }, { xtype: 'button', bin
{
xtype: 'treepanel',
bind: {
selection: '{selectedNode}'
},
...
}, {
xtype: 'button',
bind: {
disabled: '{isButtonDisabled}'
},
...
}
我的ViewModel:
Ext.define('App.view.MyViewModel', {
extend: 'Ext.app.ViewModel',
alias: 'viewmodel.myviewmodel',
requires: ['Ext.app.bind.Formula'],
data: {selectedNode: false},
formulas: {
// returns `true` if node is a leaf or node.data.ID has no value
isButtonDisabled: {
get: function(data) {
var isDisabled = true;
data = data || {};
if (data.isModel) {
isDisabled = Ext.isEmpty(data.get('ID')) || data.isLeaf();
}
return isDisabled;
},
bind: '{selectedNode}'
}
}
});
我的问题发生在以下过程中:
- 我以编程方式向树中添加一个新的树分支节点,然后选择
信息技术
未定义,因此按钮正确 残疾人newBranchNode.data.ID
- 当我调用
时,它会用一个值更新newBranchNode.set('ID',myNewValue)
,因此newBranchNode.data.ID
公式将返回isButtonDisabled
,这意味着应该启用该按钮;但是,该按钮保持禁用状态false
newBranchNode
上的字段后立即重新评估是否应禁用该按钮
编辑: 请在应用程序运行时查看控制台日志 在MyViewport.js中,我执行以下操作:
- 树的afterrender事件发生1秒后,它将创建一个新分支 节点&选择它。(按钮已正确禁用)
- 1秒钟后,它设置新节点的ID
- 1秒钟后,它会测试按钮是否仍处于禁用状态(不正确)
如果选择其他节点,然后单击“新建节点”,则按钮将正确启用。它不会自动启用。请尝试如下设置公式:
canNotAddNode: {
get: function(getter) {
var selectedNode = getter('selectedNode'),
id = getter('selectedNode.ID');
return !id || selectedNode.isLeaf();
}
}
工作示例:是,这样做会导致以下错误:
无效的domNode引用或现有domNode的id:null
。为了更好地说明这个问题,我添加了一个。这不起作用,因为我正在设置和获取一个名为“ID”而不是“ID”的属性。我正在查看newNode.data.ID
。这将不起作用,因为它没有针对所有必需的条件进行测试。1.)节点是一个分支(不是叶节点)2.)节点。get(“ID”)有一个完美的值!谢谢在阅读了您的代码和其中的“数据依赖项”部分后,我理解只要getter()中指定为参数的内容发生更改,就会调用这个公式。如果我有getter('selectedNode')
,getter('selectedNode.ID')
,和getter('foo')
,那么在对selectedNode.get(“ID”)
进行更改以及对直接位于selectedNode
或foo
下的属性进行任何更改后,它会自动重新计算此公式。