2017-06-07 91 views
1

我需要在我使用下面的代碼的那一刻就dijit/form/Select添加一些自定義的功能,但我得到以下錯誤:Dojo如何擴展dijit類?

Uncaught TypeError: SelectGroup is not a constructor

如何解決這個問題?

require([ 
    'dijit/form/Select', 
    'dojo/_base/window', 
    'dojo/domReady!' 
], function(Select, win) { 

    var SelectGroup = define([ 
    "dojo/_base/declare", 
    "dijit/form/Select" 
    ], function(declare, Select) { 
    return declare(Select, { 
     myCustom: function() { 
     alert('hey custom'); 
     } 
    }); 
    }); 

    var select = new SelectGroup({ 
    name: 'select', 
    options: [{ 
     label: '<i>Colors I love</i>', 
     value: 'G 1', 
     disabled: true 
    }, { 
     label: 'Red', 
     value: '1' 
    }, { 
     label: 'Green', 
     value: '2', 
     selected: true 
    }, 
    ] 
    }, 'select'); 

    select.on('change', function(value) { 
    alert(value); 
    }); 

}); 

回答

1

我認爲這只是在編寫define()內部require()函數時發生的錯誤!

這很簡單,你只需要讓所有的進口(要求),包括申報,並調用聲明(讓你的小部件照片直接),它會在你的var SelectGroup參考

返回新的widget請在下面找到一個工作片斷:

require([ 
 
    "dojo/_base/declare", 
 
    "dijit/form/Select", 
 
    'dojo/_base/window', 
 
    'dojo/domReady!' 
 
    ], function(declare, Select, win) { 
 
    
 
    var SelectGroup = declare(Select, { 
 
     myCustom: function() { 
 
     alert('hey custom calue is = '+this.value); 
 
     } 
 
    }); 
 
    
 
    var select = new SelectGroup({ 
 
    name: 'select', 
 
    options: [{ 
 
     label: '<i>Colors I love</i>', 
 
     value: 'G 1', 
 
     disabled: true 
 
     }, { 
 
     label: 'Red', 
 
     value: '1' 
 
     }, { 
 
     label: 'Green', 
 
     value: '2', 
 
     selected: true 
 
     }, 
 
    ] 
 
    }, 'select'); 
 
    
 
    
 
    select.on('change', function(value) { 
 
     select.myCustom(); 
 
    }); 
 

 
    
 
    });
<link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/dojo/1.12.1/dijit/themes/claro/claro.css" /> 
 

 
<script> 
 
    window.dojoConfig = { 
 
    parseOnLoad: false, 
 
    async: true 
 
    }; 
 
</script> 
 

 

 
<script src="//ajax.googleapis.com/ajax/libs/dojo/1.12.1/dojo/dojo.js"></script> 
 

 
<body class="claro"> 
 
    <div id="select"></div> 
 
</body>

+0

就是定義和聲明的區別? – Radex

+1

是的,我們無法做出聲明和定義之間的比較:), declare是一個js類,在dojo中我們可以創建類,小部件,並且擴展現有類或小部件,但是define是一個dojo AMD加載器,其中異步加載這些類,窗口小部件, 所以可以說需要之間的比較,並定義,不符合申報(申報是一個加載的類)和rquire定義是裝載機 –

+0

在道場旗,創建一個新的類,你必須選擇define爲你創建的窗口部件創建一個範圍+將refrenced窗口部件加載到回調函數中,並且對於require只加載對claback的引用,在你的例子中你將它們混合,require - >並且在裏面定義一個定義它引起了這個問題。 –