无法读取未定义的 属性 'multiSelectLabelText'

Cannot read property 'multiSelectLabelText' of undefined

我就是这样使用dojo的CheckedMultiSelect的,

var MyCheckedMultiSelect = declare(CheckedMultiSelect, {

         startup: function() {
             this.inherited(arguments);
             setTimeout(lang.hitch(this, function() {
              this.dropDownButton.set("label", "User Preferences");
             }));
         }v
 var select =   new MyCheckedMultiSelect({
        dropDown: true,
        label: "Preferences",
        multiple: true,
        name: 'state',
        invalidMessage: 'ERROR',
        onChange: getValues,
        required: true
    }, "stateSelect");
    form = new Form({
    style: 'display:inline'
    }, 'formPref');
    select.startup();

select._nlsResources.multiSelectLabelText = 'User Preferences';

我想覆盖此小部件的消息“0 item(s) selected”,默认情况下它会出现在其他消息中,例如 "User Preferences".. 所以我正在使用这个 select._nlsResources.multiSelectLabelText = 'User Preferences';

但是我的页面第一次根本没有加载,它挂起并出现以下错误 "Cannot read property 'multiSelectLabelText' of undefined"..提供一些调试此问题的指针..

我猜CheckedMultiSelect指的是dojox.form.CheckedMultiSelect
如果是,请尝试这样的操作:

var MyCheckedMultiSelect = declare(CheckedMultiSelect, {
     postMixInProperties: function() {
          this.inherited(arguments);
          this._nlsResources.multiSelectLabelText = 'User Preferences';
     }
     startup: function() {
         this.inherited(arguments);
         setTimeout(lang.hitch(this, function() {
          this.dropDownButton.set("label", "User Preferences");
         }));
     }
 });

覆盖已移入您的 MyCheckedMultiSelect 小部件。

这是CheckedMultiSelect的原始postMixInProperties方法:

postMixInProperties: function(){
    this.inherited(arguments);
    this._nlsResources = i18n.getLocalization("dojox.form", "CheckedMultiSelect", this.lang);
    if(this.invalidMessage == "$_unset_$"){ this.invalidMessage = this._nlsResources.invalidMessage; }
},

原始 postMixInProperties 将首先 运行,然后您的自定义小部件的 postMixInProperties 将覆盖 this._nlsResources.multiSelectLabelText

的值

查看代码片段:

require(['dojo/_base/declare', 'dojox/form/CheckedMultiSelect', 'dojo/domReady!'], function(declare, CheckedMultiSelect) {
  
  var MyCheckedMultiSelect = declare(CheckedMultiSelect, {
     postMixInProperties: function() {
       this.inherited(arguments);
       this._nlsResources.multiSelectLabelText = 'This is multiSelectLabelText';
     },
     startup: function() {
       this.inherited(arguments);
       this.dropDownButton.set("label", "This is dropDownButton label");
     }
  });

  
  var x = new MyCheckedMultiSelect({
    dropDown: true,
    label: "This is MyCheckedMultiSelect label",
    multiple: true,
    name: 'state',
    invalidMessage: 'ERROR',
    onChange: function() {},
    required: true,
    options: [
      { value: 'option1', label: 'label option 1' },
      { value: 'option2', label: 'label option 2' },
      { value: 'option3', label: 'label option 3' }
    ]
  
  });
  x.placeAt(document.getElementById('test'));
  x.startup();
});
<script src="//ajax.googleapis.com/ajax/libs/dojo/1.10.4/dojo/dojo.js"></script>
<link rel="stylesheet" type="text/css" href="http://ajax.googleapis.com/ajax/libs/dojo/1.10.4/dojo/resources/dojo.css"> 
<link rel="stylesheet" type="text/css" href="http://ajax.googleapis.com/ajax/libs/dojo/1.10.4/dijit/themes/tundra/tundra.css">
<link rel="stylesheet" type="text/css" href="http://ajax.googleapis.com/ajax/libs/dojo/1.10.4/dojox/form/resources/CheckedMultiSelect.css">


<div id="test" class="tundra">
</div>