我是ExtJS的新手,我使用TreePanel和TreeStore,而TreeStore又使用了我已定义的模型。该模型非常简单,只包含两个字段:" name" (字符串)和"值" (整数)。我的TreePanel有两列:一个树列(显示"名称"我的模型的字段)和一个gridcolumn(显示"值"我的模型的字段)。
我的TreeStore通过Ajax调用自动加载JSON。我的JSON测试数据如下所示:
{
"name": "Root",
"children": [
{
"name": "apple",
"value": 1
},
{
"name": "banana",
"value": 2
},
{
"name": "coconut",
"value": 3
}
]
}
我的理解是,通过指定一个与TreeStore一起使用的模型,它会导致每个模型实例都添加了NodeInterface属性/方法,以便它可以使用树结构。
在我的控制器中,我为TreePanel添加了一个事件处理程序,当我的用户点击TreePanel中的某个节点时,该事件处理程序会触发。该功能如下所示:
onTreePanelItemClick: function(view, record, item, index, e) {
console.log("Node name: " + record.data.name);
console.log("Node value: " + record.data.value);
}
到目前为止,一切正常,当我点击" apple"树中的节点,我在控制台中看到了预期的输出:
Node name: apple
Node value: 1
让我们说,只要我的用户点击树中的某个节点,我就想更新"值"该节点的字段(或者更确切地说,可能更正确地说,是商店中基础模型实例上的"值"字段),以便它包含"值"为了实现这一点,我尝试在我的onTreePanelItemClick()函数中执行以下操作:
var selectedNode = myTreePanel.GetSelectionModel().getSelection();
selectedNode.data.value = 100;
现在,我第一次点击我的" apple"节点,我在控制台中看到以下内容:
Node name: apple
Node value: 1
我第二次点击" apple"节点(在我的onTreePanelItemClick()将值更新为100之后),我在控制台中看到了这一点:
Node name: apple
Node value: 100
尽管有控制台输出,但"值"在我的TreePanel的网格列中显示的字段仍显示1(而不是100)。我怀疑我实际上没有正确更新我的树库中节点的模型实例。但我不确定如何我应该更新现有节点/模型的字段。我在TreeStore中看到的所有示例似乎都涉及添加和删除节点,但这不是我想要做的。谢谢你的建议!
答案 0 :(得分:2)
永远不要通过其(私有)数据属性访问记录数据。调用record.get(),record.set()或record.getData()。
在你的情况下,你会调用record.set({value:100});