【问题标题】:KnockoutJS selectedOptions observableArray object empty in change eventKnockoutJS selectedOptions observableArray 对象在更改事件中为空
【发布时间】:2013-09-11 20:46:33
【问题描述】:

我有一个启用了多项选择的选择菜单。

<select id="regions" data-placeholder="Choose a Region..." multiple style="height: 35px;" data-bind="options: availableRegions,selectedOptions: selectedRegions,optionsText: 'name',optionsValue: 'value',event: { change: filterResellersByRegion }"></select>

我已将选择绑定到一个 json 数组。在选择上设置数据绑定时,我将 observableArray 连接到 selectedOptions 属性。这是我的视图模型:

function ResellersViewModel() {
var self = this;

self.availableRegions = ko.observableArray([{
    'name': 'United States',
        'value': 'united-states'
}, {
    'name': 'Canada',
        'value': 'canada'
}, {
    'name': 'Latin America &amp; the Caribbean',
        'value': 'latin-america-caribbean'
}, {
    'name': 'Europe, Middle East &amp; Africa',
        'value': 'europe-middle-east-africa'
}, {
    'name': 'Asia-Pacific &amp; Japan',
        'value': 'asia-pacific-japan'
}, {
    'name': 'China &amp; North Asia',
        'value': 'china-north-asia'
}]);

self.resellers = [{
    'name': '2S',
        'url': 'http://www.2s.com.br/',
        'urlText': 'www.2s.com.br',
        'status': 'gold',
        'city': '',
        'regions': ['latin-america-caribbean']
}, {
    'name': 'Abacus Solutions LLC',
        'url': 'http://www.abacusllc.com/',
        'urlText': 'www.abacusllc.com',
        'status': 'gold',
        'city': '',
        'regions': ['united-states']
}, {
    'name': 'Accunet Solutions, Inc.',
        'url': 'http://www.accunetsolutions.com/',
        'urlText': 'www.accunetsolutions.com',
        'status': 'platinum',
        'city': '',
        'regions': ['united-states']
}, {
    'name': 'Accuvant',
        'url': 'http://www.accuvant.com/',
        'urlText': 'www.accuvant.com',
        'status': 'gold',
        'city': '',
        'regions': ['united-states']
}, {
    'name': 'Activar Soulciones, S.A. de C.V.',
        'url': 'http://www.activar.com.mx/',
        'urlText': 'www.activar.com.mx',
        'status': 'gold',
        'city': '',
        'regions': ['latin-america-caribbean']
}, {
    'name': 'Adcap Network Solutions',
        'url': 'http://www.adcapnet.com/',
        'urlText': 'www.adcapnet.com',
        'status': 'gold',
        'city': '',
        'regions': ['united-states']
}, {
    'name': 'Advanced Infraestructure & Security Solutions, SA',
        'url': 'http://www.aiss.com.mx/',
        'urlText': 'www.aiss.com.mx',
        'status': 'gold',
        'city': '',
        'regions': ['latin-america-caribbean']
}, {
    'name': 'Advanced Systems Group',
        'url': 'http://www.virtual.com/',
        'urlText': 'www.virtual.com',
        'status': 'gold',
        'city': '',
        'regions': ['united-states']
}, {
    'name': 'AE Business Solutions',
        'url': 'http://www.aebs.com/',
        'urlText': 'www.aebs.com',
        'status': 'platinum',
        'city': '',
        'regions': ['united-states']
}, {
    'name': 'Alexander Open Systems',
        'url': 'http://www.aos5.com/',
        'urlText': 'www.aos5.com',
        'status': 'gold',
        'city': '',
        'regions': ['united-states']
}];

self.selectedRegions = ko.observableArray();

self.selectedResellers = ko.observableArray(self.resellers.slice(0));

self.filterResellersByRegion = function () {
    alert(self.selectedRegions.length);
};
}

ko.applyBindings(new ResellersViewModel());

当我阅读文档时,该数组应该会随着选择的更改而更新。我也在使用更改事件。我正在尝试使用更改事件来触发另一个 json 数组上的过滤器。但是,我连接到 selectedOptions 的 observable 永远不会将数据插入其中。这可以从我对检查数组长度的更改事件的警报中看出。我究竟做错了什么?我为此问题设置了jsfiddle,请随时查看。感谢您对此的帮助。

【问题讨论】:

  • 请注意,您需要使用 multiple="multiple" 才能在所有浏览器中正常工作

标签: javascript arrays json knockout.js


【解决方案1】:

您必须使用 () 调用 observableArray 以获取其长度值。 我不知道为什么(还没有调查)但是 observableArray 上的 .length 属性不会更新并且始终为 0。 这是获取底层数组长度值的问题只有一个属性 (source)

alert(self.selectedRegions().length);

这会给你一个结果。

除非有另一个需要将该事件绑定到此元素,否则我会删除它并处理订阅/计算以对数组进行过滤。这是fiddle,附有一些注释。

【讨论】:

  • 您是正确的,因为缺少参数,但可观察数组的长度属性并不总是为零。如果您使用他原来的小提琴并添加参数,则警报中的长度属性会正确触发。
  • 对。也许我不是很清楚。 self.selectedRegions.length 始终为 0,但 self.selectedRegions().length 将在其原始小提琴警报中更新。这是其原始版本的修改版本,显示.length().length (fiddle)。 Steve Sanderson 在 KO Github source 中讨论了这个问题
猜你喜欢
  • 2016-09-10
  • 1970-01-01
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
  • 2015-07-04
相关资源
最近更新 更多