2012-10-24 63 views
1

我在JavaScript + dojo中有一段代碼有問題。我正在製作一個給定一定高度和一個字符串的小部件,如果字符串溢出,小部件會在末尾顯示帶省略號的字符串。有兩種使用這個小部件的方法,你可以將它提供給實際的字符串,或者給它一個文本文件的URL。Dojo省略函數延遲錯誤?

問題是,如果你將實際的字符串提供給小部件,它會失敗,但如果你給它的URL完美的作品。下面的代碼:

define(["dojo/_base/declare","dijit/_WidgetBase", "dijit/_TemplatedMixin", "dojo/text!./template/template.html", "dojo/_base/xhr", "dojo/dom-style", "dojo/_base/lang"], 

function(declare, WidgetBase, TemplatedMixin, template, xhr, domStyle, lang){ 

return declare([WidgetBase, TemplatedMixin], { 

     templateString: template, 

     textSrc: "", 

     content: "", 

     height: 100, 

     ellipsis: "...", 

     endPoint: "Read more...", 

     postCreate: function(){ 
      this.inherited(arguments); 

     }, 

     _setHeightAttr: function(av) { 
      this._set("height", av); 
      domStyle.set(this.domNode, "height", this.height +"px"); 
     }, 

     _setContentAttr: function(av) { 
      this._set("content", av); 
      if(this.content!=""){ 
      this._addText(this.content); 
      } 
     }, 

     _setTextSrcAttr: function(av) { 

      this._set("textSrc", av); 
      if(this.textSrc!=""){ 
       var articleText = xhr.get({ 
        url: this.textSrc, 
        handleAs: "text" 
       }); 
       var domNode = this; 
       articleText.then(function(text){ 
        domNode._addText(text); 
       }); 
      } 
     }, 

     _addText: function(text){ 
      var index = 0; 

      while(this.measureNode.scrollHeight < this.height && index < text.length) 
      {  
       this.containerNode.innerHTML += text.charAt(index); 
       index++; 
      } 

      if(index < text.length){ 
       this.containerNode.innerHTML = text.substring(0,index-1); 
      } 
      else{ 
       this.ellipsisNode.innerHTML = ""; 
       this.endPointNode.innerHTML = ""; 
      } 
     } 

    }); 
}) 

所以基本上這個小部件的工作原理是,如果我打電話的內容,而不是textSrc,在內容上串被送至addText()來顯示它。否則,xhr讀取textSrc的URL並將URL中的字符串發送到addText()addText()在字符串中添加字符,直到measureNode高度超過所需高度(containerNode在measureNode中)或者沒有字符。最後會有一個省略號和一個「多讀」錨點的空間。現在的問題是,使用內容從不工作,這裏是一些「症狀」

  1. 顯示整個字符串,即使存在溢出
  2. 的原因是,this.measureNode.scrollHeight始終爲0。這是奇怪的,因爲當我使用它的URL爲textSrc時,它會產生預期的數字。

我喂只是一個字符串既textSrc和內容_setContentAttrdomNode._addtext("etc")所以像this._addText("blah blah blah blah ...")textSrc,結果是一樣的。此外,我替換了使用textSrc與內容調用此小部件時的實例,反之亦然,只有textSrc成功。這意味着它不是一個CSS問題。我的猜測是,這與推遲有關,因爲xhr推遲執行textSrcaddText命令,而內容沒有執行。任何人都可以向我解釋發生了什麼以及我如何解決這個問題?

編輯:所以我覺得我孤立的問題是,小部件中的domNode的offsetHeight,clientHeight不活躍,因爲可能html尚未呈現。推遲使用URL是因爲到那時,渲染已完成。但我仍然無法找到合理的解決方案。由於某種原因,postCreate事件不起作用。任何人都知道解決方法?謝謝!

+0

你知道,CSS可以做一個溢出的省略號,而不需要任何Javascript?或者我錯過了一些與標準CSS選項無關的需求? – Spudley

+0

CSS省略號溢出僅適用於單行div。它會失敗的多行文本,所以我創造了我自己的需求。除此之外,我還需要在CSS無法提供的文本末尾添加「閱讀更多內容」。 –

+0

夠公平的;這就說得通了。我以爲我可能錯過了一些明顯的東西。:) – Spudley

回答

0

好吧我想通了。因此,我懷疑postCreate_set(something)Attr發生在您的小部件的變量創建。這個小部件的容器使用一個placeAt命令將小部件放在那裏。然而_addText(...)之前調用placeAt被調用,所以小部件計算clientHeight時,它甚至還沒有在頁面上存在。我所要做的只是在部件的容器placeAt調用後移動_addText(...)調用,並且一切正常。