如何在Ext Js中动态设置isDirty()值
我有表单面板,其中包含文本框,单选按钮和保存按钮。在afterrender函数中,我正在为文本框设置一个值。加载页面后,isDirty()返回true,但我的要求是当我点击更新按钮时它应该返回true。
我怎么能做到这一点。
我尝试使用trackResetOnLoad = true但它无效。
小提琴的例子是 https://fiddle.sencha.com/#fiddle/1d74
更新: - 在Afterrender功能之后我需要跟踪更改或更新。
答案 0 :(得分:0)
您可以通过将 值 配置赋予文本字段而不是在afterrender中设置任何内容来实现相同的功能。当您运行以下代码时,首次单击时, isDirty 按钮将无法生效。
Ext.onReady(function() {
var form = new Ext.form.Panel({
itemId:'panelFormID',
trackResetOnLoad: true,
renderTo: Ext.getBody(),
items: [{
xtype: 'textfield'
,name: 'username'
,itemId : 'username'
,fieldLabel: 'username'
, value:'stackoverflow'
},{
xtype: 'textfield'
,name: 'password'
,itemId : 'password'
,fieldLabel: 'password'
}, {
xtype: 'button',
text : 'isDirty' ,handler: function() {
alert(Ext.ComponentQuery.query('#panelFormID')[0].isDirty());
}},
{
xtype: 'button',
text : 'Update' ,
handler: function() {
Ext.ComponentQuery.query('#username')[0].setValue ('resetvalue');
Ext.ComponentQuery.query('#password')[0].setValue ('restpassword');
}
}]
}
})
});
答案 1 :(得分:0)
您可以使用表单组件的setValues方法来实现此目的。当表单的trackResetOnLoad属性为true时,这无法改变您的脏状态。
在你的情况下,你可以这样做;
Ext.ComponentQuery.query('#panelFormID')[0].up('form').getForm().setValues({
username : 'reset value',
password : 'resetpassword'
});
这些对象属性与组件的name属性相关。当你错过了一些场地的价值时,它会被设置为空。所以你必须得到它所有的价值并改变你的愿望并重新设定。
答案 2 :(得分:0)
在afterrender监听器中使用以下代码:
var items = Ext.ComponentQuery.query('#panelFormID') [0].getForm().getFields().items,
i = 0,
len = items.length;
for(; i < len; i++) {
var c = items[i];
if(c.mixins && c.mixins.field && typeof c.mixins.field['initValue'] == 'function') {
c.mixins.field.initValue.apply(c);
c.wasDirty = false;
}
}
答案 3 :(得分:0)
isDirty()依赖于各个组件的 originalValue 。在你将值设置为字段后,你还需要设置originalValue字段。我在afterrender代码中添加了这一行:
afterrender :function () {
Ext.ComponentQuery.query('#username')[0].setValue ('stackoverflow');
//new line
Ext.ComponentQuery.query('#username')[0].originalValue='stackoverflow'
Ext.ComponentQuery.query('#panelFormID')[0].trackResetOnLoad = true;
}
答案 4 :(得分:0)
请在设定值后尝试使用此功能(在后续功能中):
#include <iostream>
#include <map>
#include <string>
#include <chrono>
#include <thread>
std::map<std::string, std::string> g_pages;
void save_page(const std::string &url)
{
// simulate a long page fetch
std::this_thread::sleep_for(std::chrono::seconds(2));
std::string result = "fake content";
g_pages[url] = result;
}
int main()
{
std::thread t1(save_page, "http://foo");
std::thread t2(save_page, "http://bar");
t1.join();
t2.join();
for (const auto &pair : g_pages) {
std::cout << pair.first << " => " << pair.second << '\n';
}
}