【问题标题】:ExtJS 5: Set child View Model data from bound valueExtJS 5:从绑定值设置子视图模型数据
【发布时间】:2015-11-23 16:36:20
【问题描述】:

我有一个有自己的视图模型的类,我在我的主视图中创建了这个类的 2 个实例。在主视图中,我想为我的 2 个类实例传递值,但我似乎无法让它工作......我想我只是不理解一些非常简单的概念。

预期结果是 value1 + value2 字段有 value1 和 value2 的串联,第一个 myValue 显示 value1,第二个 myValue 显示 value2。这是我的代码和example

Ext.application({
  name: 'Fiddle',

  launch: function() {
    Ext.define('MyViewModel', {
      extend: 'Ext.app.ViewModel',
      alias: 'viewmodel.myView',
      formulas: {
        doSomething: function(getter) {
          console.log(getter('value1'), getter('value2'));
          return getter('value1') + getter('value2');
        }
      }
    });

    Ext.define('MyView', {
      extend: 'Ext.panel.Panel',
      xtype: 'myView',
      viewModel: {
        type: 'myView'
      },
      config: {
        myValue: null
      },
      publishes: {
        myValue: true
      },
      items: [
        {
          xtype: 'displayfield',
          fieldLabel: 'myValue',
          bind: {
            value: '{myValue}'
          }
        }
      ]
    });

    Ext.create('Ext.container.Container', {
      renderTo: Ext.getBody(),
      items: [
        {
          xtype: 'displayfield',
          fieldLabel: 'display',
          bind: {
            value: '{doSomething}'
          }
        },
        {
          xtype: 'myView',
          reference: 'view1',
          title: 'View1',
          bind: {
            myValue: '{value1}'
          }
        },
        {
          xtype: 'myView',
          reference: 'view2',
          title: 'View2',
          bind: {
            myValue: '{value2}'
          }
        }
      ],
      viewModel: {
        data: {
          value1: 'Something',
          value2: 'something else'
        }
      }
    })
  }
});

【问题讨论】:

  • 为什么你认为你的Ext.container.Container 实例会使用MyViewModel?在其 viewModel 配置中指定 type: 'myView' 并查看差异。同样,如果 myView 绑定有自己的视图模型,你怎么能期望它们使用来自父视图模型的数据?
  • 我实际上不希望我的容器使用 MyViewModel... 但是,我确实用我的两个数据值指定了它自己的本地 viewModel。我希望我能以某种方式将父母绑定的数据传递给孩子,但我想这是不可能的?
  • 这一切皆有可能,但这将使您的设计更紧密地耦合。 “最佳实践”解决方案将取决于您的实际目标。例如,myView 实例可能不需要拥有自己的视图模型,它们可以使用父视图模型?
  • 嗯,就是这样,我想在其他视图中使用这个类,所以我基本上想防止到处复制和粘贴代码。我只是希望我能给它一个父母的绑定变量......我想我完全错了。

标签: javascript extjs mvvm extjs5


【解决方案1】:

您的第一个 displayField 永远不会“看到” doSomething 公式,因为该公式不是其父级的一部分,因此您需要将公式从 MyViewModel 移动到您的 Ext.container.Container viewModel。

此外,当您发布自定义值时,它将具有reference.publishedvalue 格式。这应该可以修复您的面板:

Ext.application({
    name: 'Fiddle',

    launch: function() {
        Ext.define('MyViewModel', {
            extend: 'Ext.app.ViewModel',
            alias: 'viewmodel.myView'
        });

        Ext.define('MyView', {
            extend: 'Ext.panel.Panel',
            xtype: 'myView',
            viewModel: {
                type: 'myView'
            },
            config : {
                myValue : null
            },
            publishes : ['myValue'], 
            items: [{
                xtype: 'displayfield',
                fieldLabel: 'myValue',
                initComponent : function() {
                    var me = this,
                        owner = me.$initParent || me.initOwnerCt;

                    this.setBind({
                        value: '{' + owner.reference + '.myValue}'
                    });
                    this.callParent();
                }
            }]
        });

        Ext.create('Ext.container.Container', {
            renderTo: Ext.getBody(),
            viewModel: {
                data: {
                    value1: 'Something',
                    value2: 'something else'
                },
                formulas: {
                    doSomething: function(getter) {
                        console.log(getter('value1'), getter('value2'));
                        return getter('value1') + getter('value2');
                    }
                }
            },
            items: [{
                xtype: 'displayfield',
                fieldLabel: 'display',
                bind: {
                    value: '{doSomething}'
                }
            },{
                xtype: 'myView',
                reference: 'view1',
                title: 'View1',
                bind: {
                    myValue: '{value1}'
                }
            },{
                xtype: 'myView',
                reference: 'view2',
                title: 'View2',
                bind: {
                    myValue: '{value2}'
                }
            }]
        })
    }
});

【讨论】:

  • 哈哈,呵呵!当我匆忙举个例子时,就会发生这种情况……我知道doSomething 不起作用有些奇怪。但我真正关心的是你对initComponent 中的setBind 所做的事情。我真的很惊讶没有更好的方法来做到这一点。
  • 如果你想跳过整个引用的东西,你可以强制双向绑定,检查这个小提琴:fiddle.sencha.com/#fiddle/t1h
  • 你说的完全正确...当我使用 configpublishbind 的组合时,我认为设置了双向绑定。我忘了我必须为自定义属性设置一个实际的方法。伙计,那是个愚蠢的错误。谢谢。
  • 发布配置用于发布配置的值,而您想要的是从 viewModel 数据中获取值。将字段添加到 config 块使您可以将其添加到 bind 块。有时可能会令人困惑,但请仔细阅读:docs.sencha.com/extjs/6.0/6.0.0-classic/#!/api/…
猜你喜欢
  • 2016-11-25
  • 2013-09-25
  • 2023-03-13
  • 2015-12-24
  • 2014-11-18
  • 2013-08-17
  • 1970-01-01
  • 1970-01-01
  • 2014-02-12
相关资源
最近更新 更多