2014-01-19 59 views
2

我的Javascript UI對象是這樣的:使用Javascript - 谷歌關閉標註屬性類型

function MyUIElement() { 
    div = document.createElement("div"); 
    div.id = "my_element_x"; 
    div.innerHTML = "whatever"; 
    ... 

    this.hide = function() { 
     div.style.display = "none"; 
    }; 

    this.show = function() { 
     div.style.display = "block"; 
    }; 

    this.showData = function(data) { 
     ... 
    } 

    this.div = div; 
} 

function addUIElement(element) { 
    app_div.appendChild(element); 
} 

myElement = new MyUIElement(); 
addUIElement(myElement.div) 

我注意到Closure編譯器不知道myElement.div的類型,所以我加了一個類型吧:

function MyUIElement = { 
    /** 
    * @type {Element} 
    */ 
    div = document.createElement("div"); 
    div.id = "my_element_x"; 
    div.innerHTML = "whatever"; 
    ... 

但它仍然不知道類型。我必須註釋「this.div = div」才能識別類型。

我只是想知道這種情況的最佳/通用解決方案是什麼。我是否應該使用this.div來訪問我的div,以避免註釋兩次?有沒有其他方式我應該控制MyUIElement類的公共/私有變量?

回答

1

您有幾個語法錯誤。嘗試刪除全局變量div並更正函數聲明(即function MyUIElement() {)。另外this.showData被錯誤地聲明。

function MyUIElement() { 
    /** 
    * @type {Element} 
    */ 
    var div = document.createElement("div"); 
    div.id = "my_element_x"; 
    div.innerHTML = "whatever"; 

糾正這些問題,讓它編譯我正確:compileduncompiled

如果你在高級編譯(你永遠不指定),你需要一些提示添加到編譯器的構造和什麼被認爲是一個公衆可訪問的變量上this

/** 
* some description 
* @expose 
* @constructor Necessary to specify that this is a constructor function 
*/ 
var MyUIElement = function() { 
    /** @expose expose means this is accessible to the public don't minimize the var name */ 
    var div = this.div = document.createElement("div"); 
    div.id = "my_element_x"; 
    div.innerHTML = "whatever"; 

    /** @expose */ 
    this.hide = function() { 
     div.style.display = "none"; 
    }; 

    /** @expose */ 
    this.show = function() { 
     div.style.display = "block"; 
    }; 

    /** @expose */ 
    this.showData = function(data) { 

    } 
} 
var myElement = new MyUIElement(); 
+0

修正它們,謝謝。仍然與我的問題無關。 – user3117610

+2

它在我編譯簡單和高級的片段時起作用,所以最新的問題是什麼?你仍然有一個全局變量'div'。嘗試'var div = this.div = ...',我假設你使用高級補償正確嗎? – megawac

+1

'@ expose'現在已被棄用。作者應該將他們的代碼遷移到使用'@ export'來代替。 –