2013-12-18 68 views
0

我想将我的ASP.NET MVC应用程序转换为一个使用淘汰赛。Knockout是一个缓慢的框架?

转换我的第一个视图后,我注意到淘汰赛需要更长的时间来呈现与MVC相同数量的数据。这是我的淘汰赛代码来显示列表名称。

<html> 
<head> 
    <script src="../../Assets/knockout/js/knockout-3.0.0.js" ></script> 
</head> 
<body> 
    <ul data-bind="foreach: lists, visible: lists().length > 0"> 
     <li> 
      <strong data-bind="text: title" ></strong>    
     </li> 
    </ul> 
    <script type="text/javascript">  
     function List(data) { 
      this.title = ko.observable(data.Title); 
     } 

     function ListViewModel() { 
      var self = this; 
      self.lists = ko.observableArray([]); 

      $.getJSON("/home", function (json) { 
       var data = JSON.parse(json); 
       var mappedlists = $.map(data, function (item) { 
        return new List(item); 
       }); 
       self.lists(mappedlists); 
      }); 
     } 
     ko.applyBindings(new ListViewModel()); 
    </script> 
</body> 

我相信淘汰赛不能是缓慢的,是有什么我这里缺少

注:为便于比较,我已在同一视图(并排),以同时使用看哪个先出现

+2

在第一种情况下,页面到达格式。在第二次下载内容并且在页面加载后开始格式化,因此它必须更慢。 – Emil

+0

@Emil谢谢,我的部分在同一页面上检查性能是错误的。即使淘汰赛速度更快,它会稍后渲染。 –

回答

2

由于您的页面有额外的调用(和页面加载),所以速度较慢。

我建议摆脱getJSON通话的同时渲染视图注入模型:

<script type="text/javascript"> 
    // our model data 

    var data = @Html.Raw(JsonConvert.SerializeObject(this.Model)); 

    // start knockout 

    MyEntity.Init(data); 
</script> 
+0

您可能需要“安装包Newtonsoft.Json” –

0

您可以通过直接将数据发送到从控制器的观点摆脱这一点。这可以帮助您避免不必要的ajax调用回服务器。下面是例如:

在控制器方法:

return View(<viewmodel class name>); 

,然后在视图中,可以将敲除结合之前使用此:

var jsonData = new HtmlString(new JavaScriptSerializer().Serialize(this.Model)); 

,然后可以通过在基因敲除视图模型此对象。

2

在这种简单的情况下,使用knockout是没有意义的,因为您不受益于双向数据绑定。你所做的只是显示一些数据。如果您使用的是ASP.NET MVC,则可以使用Razor从服务器端渲染此数据。这是有道理的使用淘汰赛,然后你想制作交互式屏幕。您也可以使用像Durandal这样的框架来构建企业级单页面应用程序。它使用knockout进行数据绑定,并且在我看来,它为标准的ASP.NET MVC应用程序提供了真正的性能优势。

+0

我共享的代码是我用来检查淘汰赛vs mvc的表现。完整的应用程序本身就是一个应用程序。 –

1

你不能比较挖空和ASP.NET MVC的性能。一个是客户端框架,另一个是服务器端。

它们都在完全不同的环境中运行,所以比较起初无用。

此外,我不会打电话跑两页并排查看哪一个先出现一个体面的表现指标。

+0

这些是制作网页应用程序的众多方法中的两种,而性能是帮助您决定的标准。所以我不会称之为无用的。虽然我同意并排运行并不是比较表现的方法。 –

+0

尽管您可以测试某个特定页面是否使用MVC或Knockout更快地渲染,但您要求的是MVC和Knockout之间速度的比较。这根本不可能,因为他们做了非常不同的事情 – Kenneth