2014-03-25 45 views
0

通常我們需要從列表中顯示項目,例如,您可以有幾個項目,每個用戶可以在其中一些項目上工作,分配項目時,我們添加projectfirst,然後使用projectId引用它們。處理列表項目(顯示和編輯)的正確方法?

當我開始玩Breezejs和Knockout時,我發現當有50多個項目時使用下拉(選擇)html元素是不實際的,並且在不允許用戶使用下拉菜單的情況下是不正確的改變價值。所以我拿下面的代碼從projectId中獲取項目名稱

itemName: function (items, item) { 
     var r = ''; 
     if (item() == '') return r; 
     var match = ko.utils.arrayFirst(getLocal('projects', 'name', true), function (i) { 
     return i.id() === item(); 
     }); 
     if (match) r = match.name(); 
     return r; 
    } 

項目是本地預取和存儲的項目列表。 但我發現性能仍然不能接受,javascript很忙,我覺得arrayFirst是不夠高效的搜索?

現在我讓服務器端返回projectId和projectName,並在需要時顯示projectName,看起來更好,但除了數據冗餘之外,在保存更改時還有另一個問題。

任何建議什麼是正確的方法在這裏做?

謝謝

+0

arrayFirst是一個簡單的循環遍歷你的回調函數,它不會成爲你的問題的原因,特別是只有50個項目。您是否使用瀏覽器的開發工具來分析您的JavaScript? –

+0

70行370個選項,沒有profiler,javascript很忙。 – wyx2000

+0

它在哪裏忙?遍歷370個項目的數組仍然很快,但執行回調可能不會。 –

回答

0

我的建議;將項目數據公開爲Lookup List

然後在應用程序啓動時向此列表發出請求。

在用戶頁面上,本地項目列表加載到一個可觀察Projects()

當綁定,您的選擇列表可能看起來像:

<!-- ko foreach: Users --> 
    <!--Other fields go here --> 
    <select size="10" data-bind="options: $parent.Projects, 
         optionsText: 'name', value: projectId"> 
          </select> 
<!-- /ko --> 

您將有大小的滾動列表能力10.(你的尺寸可以和你的情況一樣)。值projectId實際上是Users的外鍵值,它將被保存到數據庫中,您不必使用敲除arrayFilterarrayFirst

經過100多排測試,性能令人滿意。

希望有所幫助。

+0

除了不確定尺寸屬性是否有幫助,我確實使用過這種方式,我有70行,而選項列表是370.似乎性能還不夠好。 – wyx2000

相關問題