ExtJS:如何在另一个函数中调用函数?

时间:2018-01-23 14:30:30

标签: javascript extjs combobox store getter-setter

我知道有很多关于在另一个函数中调用函数的问题,但不幸的是,它们都没有为我工作,或者我无法实现我的项目!

我有一个Window类,里面有两个函数。第二个是通过combobox获取带有ID的特定网址并将其返回。我需要在第一个URL;

中使用此生成的function
getSelectCountry: function(){
        var countryRecord   = Ext.ComponentQuery.query('[name=country]')[0].getSelectedRecord();
        var countryId       = countryRecord.get('id');
        var urlWithId       = MyApp.Globals.getUrl() + '/city/view/list/?countryid='+ countryId;

        // var store =  Ext.getStore('cityCombo');
        // store.load({
        //     url : MyApp.Globals.getUrl() + '/city/view/list/?countryid='+ countryId,
        // });

        return urlWithId;
    }

我需要在urlWithId citycombo proxy内的url下面使用此返回的Ext.define('MyApp.view.weather.SettingsWindow', { ... getSettingsItems: function () { var me = this; var settingsItems = [ { xtype: 'form', layout: {type: 'vbox', align: 'stretch', pack: 'start'}, reference: 'settingsForm', items: [ { xtype: 'citycombo', itemId: 'cityName', name: 'city', afterLabelTextTpl: MyApp.Globals.required, allowBlank: false, flex: 1, store: { storeId: 'cityCombo', proxy: { type: 'ajax', // I neeed returned URL with ID on here. url: MyApp.Globals.getUrl() + '/city/view/list/', reader: { type: 'json', rootProperty: 'data' } }, pageSize: 0, sorters: 'description', autoLoad: true } }, 。它将列出城市取决于以下国家;

store.load

我已尝试使用URL或创建一个新变量并调用它,但我无法成功进行任何尝试。

我很乐意接受任何想法。

更新

  • 请检查屏幕截图:UIcode structure
  • 我正在尝试通过getSelectCountry函数(1)生成完整citycombo,并使用此新返回的网址过滤[XmlRoot("ColorPages")] public class ColorPages { [XmlElement("Ghost")] List<Ghost> ghost{ get; set; } [XmlElement("Page")] List<Page> page{ get; set; } } [XmlRoot("Ghost")] public class Ghost { } [XmlRoot("Page")] public class Page { } 上的城市查询(2)即可。

2 个答案:

答案 0 :(得分:1)

如果只是关于那个小参数,那么你真正想要做的就是在商店的beforeload监听器中填充extraParams属性。

listeners: {
    beforeload: function(store) {
        // Get countryRecord from somewhere...
        store.getProxy().setExtraParams("countryid", countryRecord.get('id'))
    }

如果服务器/路径名也不同,您还可以setUrl()

相关小提琴:https://fiddle.sencha.com/#view/editor&fiddle/2c8a

更新:

那么,你真正想做的是:

    xtype: 'combobox',
    queryMode: 'local',
    fieldLabel: 'Country',
    store: ...,
    listeners: {
        select: function(combo, countryRecord) {
            var cityStore = combo.nextSibling().getStore();
            cityStore.getProxy().setExtraParam('countryId', countryRecord.get('Id'));
            cityStore.load();
        }
    },
},{
    xtype: 'combobox',
    queryMode: 'local',
    fieldLabel: 'City',
    store: ...,

答案 1 :(得分:1)

我看到两种可能性:

  1. 扩展 Alexander的解决方案。假设cityCombo已定义了设置urlextraparams的前载回调,您可以在change组合框上定义country侦听器,并调用cityCombo's } load()从那里开始。
  2. 见下文:

    listeners: {
        change: function () {
            Ext.getStore('cityCombo')
                .load()
        }
    }    
    

    或者甚至更好,从商店中移除beforeload并将其中的内容放在第一个change

    combobox
    listeners: {
        change: function (combo, newValue) {
            var cityStore = Ext.getStore('cityCombo')
            cityStore.getProxy()
                .setUrl(getSelectedCountry());
    
            cityStore.load();
        }
    }
    

    注意:您可以进一步重构它,摆脱getSelectedCountry()并在侦听器传递的组合上完成所有操作

    1. 使用cityCombo上的过滤器代替往返
    2. 编辑:修复了第一个代码块的显示,添加了缺少load()调用。