【问题标题】:How to know if the data in the viewmodel has been changed?如何知道视图模型中的数据是否已更改?
【发布时间】:2021-03-31 06:24:55
【问题描述】:

我有 3 个这样的字段:


   {
    name: 'firstName',
    fieldLabel: 'First name',
    bind: '{person.firstName}',
    xtype: 'textfield',
    allowBlank: false,
    listeners: {
        blur : {
           buffer : 1000,
           fn : 'detectGender'
         },
        }
    },
{
    name: 'middleName',
    fieldLabel: 'Middle name',
    bind: '{person.midleName}',
    xtype: 'textfield',
    allowBlank: true,
    listeners: {
        blur : {
           buffer : 1000,
           fn : 'detectGender'
         },
        }
    },
{
    name: 'lastName',
    fieldLabel: 'Last name',
    bind: '{person.lastName}',
    xtype: 'textfield',
    allowBlank: true,
    listeners: {
        blur : {
           buffer : 1000,
           fn : 'detectGender'
         },
        }
    },

而且我有一个判断用户性别的函数:

 detectGender: function () {
        const vm = this.getViewModel()
        const firstName = vm.get('person.firstName');
        const lastName = vm.get('person.lastName');
        
        const personName = `${firstName ? firstName : ' '}${middleName ? middleName : ' '}${lastName ? lastName : ' '}`

        if (firstName) {
      
             //ajax request to server with data: personName 
             // personName migth be  SarahSmith, or Sarah, or SarahEllen, or SarahEllenSmith

        }
    },

它有效,但我的问题是,如果所有这些字段都已填写,则函数“detectGender”会运行三次。我的服务器返回三个响应。但我只需要运行一次。也许有一些方法可以为视图模型创建一个事件,以便在更改人名时进行监听?
或者关于如何只从三个字段中发送用户名一次的任何想法? 希望我很清楚...请任何帮助

【问题讨论】:

  • 只检查3个名字不为空。类似 if(!Ext.isEmpty(firstName) && !Ext.isEmpty(middleName) && !Ext.isEmpty(lastName) { SEND YOUR AJAX REQUEST }

标签: extjs listener viewmodel bind


【解决方案1】:

我认为亚瑟的评论可能是解决问题的最简单方法。

不过,这里还有更多选择。

Opt1 - 您可以将每个名称字段放在“父级”中并监听父级上的“模糊”事件。在 sencha fiddle 示例中,查看我使用“fieldcontainer”设置的代码“Opt1”。由于容器没有“blur”事件,因此使用“focusleave”事件。我想到了我的两个选项,这将是最好的,因为它可以很好地指示用户已完成输入名称。

                // Opt 1: Detect "blur" on higher level element
                // so you know user is done
                xtype: 'fieldcontainer',
                layout: 'hbox',
                fieldLabel: 'Name',
                listeners: {
                    // "Opt1: blur equivilent" for a container
                    focusleave: 'detectGender'
                },
                items: [{
                    name: 'firstName',
                    emptyText: 'First',
                    bind: '{person.firstName}',
                    xtype: 'textfield',
                    allowBlank: false
                }, {
                    name: 'middleName',
                    emptyText: 'Middle',
                    bind: '{person.middleName}',
                    xtype: 'textfield',
                    allowBlank: true
                }, {
                    name: 'lastName',
                    emptyText: 'Last',
                    bind: '{person.lastName}',
                    xtype: 'textfield',
                    allowBlank: true
                }]
            }

Opt2 - 你提出了监听 viewModel 数据。我已经提供了一个示例,但它基本上是一个“更改”事件,因此每次有人在该字段中键入一个字母时,您都会收到一个事件,从而导致您现在遇到类似的问题。我做了一个有趣的例子,用一个节流函数来帮助延迟,但我认为你最终会调用服务器的方式太多,不像上面那样,你不知道什么时候有人“完成”输入了名字。

这使用了 ViewController 上的 bindings 配置,这为手动调用 viewModel.bind() 提供了便利,这是您可以“监听”viewModel 数据的方式。

这是小提琴,希望将两个示例合二为一不会太令人困惑。

Sencha Fiddle

【讨论】:

  • 非常感谢!我喜欢使用绑定的想法。但是我在我的 init 函数中更改了模型绑定,如下所示: this.getViewModel().bind('{fullName}', Ext.Function.createBuffered(this.detectGender, 1000, this), this); createBuffered 函数允许我发送缓冲请求。
猜你喜欢
  • 2015-03-28
  • 2013-09-22
  • 1970-01-01
  • 2017-04-28
  • 2017-03-23
  • 1970-01-01
  • 1970-01-01
  • 2011-01-26
相关资源
最近更新 更多