2014-03-25 46 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

相关问题