如何在Ext Js中动态设置isDirty()值

时间:2016-07-07 01:46:35

标签: javascript extjs extjs4

如何在Ext Js中动态设置isDirty()值

我有表单面板,其中包含文本框,单选按钮和保存按钮。在afterrender函数中,我正在为文本框设置一个值。加载页面后,isDirty()返回true,但我的要求是当我点击更新按钮时它应该返回true。

我怎么能做到这一点。

我尝试使用trackResetOnLoad = true但它无效。

小提琴的例子是 https://fiddle.sencha.com/#fiddle/1d74

更新: - 在Afterrender功能之后我需要跟踪更改或更新。

5 个答案:

答案 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';
    }
}