2011-11-03 112 views
0

以下視圖中的大部分渲染函數都是無關緊要的,我認爲,但我爲了完整性而離開它。我正在瀏覽一系列工作流程步驟,注意根據事物的各種狀態來切換li的類。爲什麼我的骨幹視圖渲染「undefined」在頂部?

var WorkStepView = Backbone.View.extend({ 
    className: "workflowStep", 

    render: function() { 
     var output; 
     var arrowPlaced = false; 
     var self = this; 
     i = 0; 
     _.each(this.collection.models, function(s) { 
      var post = ""; 
      var classname = ''; 
      if (s.attributes["complete"] != 1) { 
       if (! arrowPlaced) { 
        classname = "current"; 
        if (s.attributes["adminCompletable"] == 1) { 
         post = ' - <input onClick="completeStep(' + i + ');" type="button" value="Completed" />'; 
        } 
        arrowPlaced = true; 
       } 
       else { 
        classname = "future"; 
       } 
      } 
      else { 
       classname = "past"; 
      } 
      output += '<li class="' + classname + '">' + s.attributes["description"] + post + '</li>'; 
      i++; 
     }); 
     this.el.innerHTML = output; 
     return this; 
    }, 
}); 

當用戶從頁面上其他地方的列表中選擇一個資產時,它會產生一堆包含這些東西的數據。資產「擁有」一個工作流程,「有」很多步驟。步驟數據存儲在window.Steps,然後這就是所謂的:

function populateSteps() { 
    window.workStepLists = new WorkStepView({ 
     collection: window.Steps, 
     el: $('#workflowSteps')[0], 
    }); 
    workStepLists.render(); 
} 

但後來我得到這個:
enter image description here

有這多餘的「不確定」那裏在列表的頂部。在獲取和渲染這個模型之前,它並不存在。我根本不知道這是怎麼回事。

幫助?

+0

剛一說明:你應該做的事's.get( 「PROPNAME」)'代替's.attributes [ 「PROPNAME」]' 。我不認爲這是一個問題,但我想我會指出。 –

+0

另外,使用Underscore'each'函數的首選方法是this.collection.each(function(){});'但這實際上只是選擇nits。 –

+0

如果在循環後執行'console.log(output)',它看起來像什麼? –

回答

3

您未初始化output爲任何東西。所以,output += "foo"變成「undefinedfoo」。

只需使用一個空字符串初始化輸出變量:

var output = ''; 
+0

我喜歡JavaScript。什麼其他語言可以強制未定義的虛無與文字字符串「undefined」?感謝Brian。 –