2011-09-14 128 views
1

所以我問了一個較早的問題(Original Question)。我得到了一個很好的答案,完全符合我的想法。但是,由於我是Javascript/Dojo的新手,我無法完全理解它,而且這個問題的回答者也不是。DOJO:功能參數說明

我的問題是:下面的代碼是如何工作的?

dndController: function(arg, params){ 
    return new dijit.tree.dndSource(
     arg, // don't mess up with the first parameter 
     dojo.mixin({}, params, {copyOnly:true})) 
      //create a copy of the params object, but set copyOnly to true 
} 

所以最讓我煩惱的是「args」和「params」參數。我不明白他們來自哪裏以及他們的意思或代表。 (如果需要更多的代碼上下文,我可以稍後編輯問題,所以只需將它發佈在註釋中)。另外,爲什麼我不能直接使用new dijit.tree.dndSource,爲什麼我需要使用函數來返回它?

謝謝

+0

尋找任何調用'dndController'。你可能會*直接使用'new ...',但是它更短? –

+0

它看起來像它在樹的構造函數中。我正在覆蓋樹的聲明中的默認dndController。 – hbhakhra

+0

看起來Dojo使用'dndController'作爲擴展點以允許任意的'dndSource'定義。這裏你使用的是stock'tree.dndSource'。所以'this'參數將是樹本身,它是'tree.dndSource'所要求的,所以它的實現可以被任意樹使用。 –

回答

1

看看dojo源代碼中的dijit/Tree.js。

在Tree.js

,該postCreate功能(用於任何部件的生命週期的dijit的一部分)裏:

if(this.dndController){ 
    if(dojo.isString(this.dndController)){ 
     this.dndController = dojo.getObject(this.dndController); 
    } 
    var params={}; 
    for(var i=0; i<this.dndParams.length;i++){ 
     if(this[this.dndParams[i]]){ 
      params[this.dndParams[i]] = this[this.dndParams[i]]; 
     } 
    } 
    this.dndController = new this.dndController(this, params); 
} 

你會看到哪些檢查dndController屬性是什麼部分。如果它是一個字符串,它將dndController屬性設置爲創建該字符串描述的類的函數(這是dojo.getObject(string)正在執行的操作)。

例如,如果this.dndController是字符串"my.special.dnd.controlller",它將返回被調用的實例化一個新實例my.special.dnd.controller的函數。

然後複製一些參數到一個對象,然後通過執行是功能之一:

(1)查找經由dojo.getObject

(2)使用您在通過了自定義函數。

我會假設這個小部件的維護者是這樣做的,因爲有些人只需要指定一個特定的類來用作dnd控制器,而其他人則需要根據樹的參數傳遞一些更自定義的東西。