【问题标题】:knockout.js external model js fileknockout.js 外部模型 js 文件
【发布时间】:2014-11-02 14:00:01
【问题描述】:

我有一个 MVC.NET 应用程序,它使用 Knockout.js (+ knockout.mapping) 来处理一些级联下拉菜单。这些数据来自对外部服务的 WebAPI 调用。碰巧此服务需要一个身份验证令牌,该令牌在 2 小时后过期,因此我让 MVC 应用程序将来自服务的数据放入 System.Web.Caching.Cache 并从那里返回它,除非令牌已过期它将抓取它再次从服务。 这工作正常。 但是,当我需要将其发送到视图时,我目前正在使用以下方法,即拥有 ViewModel 的属性,我将服务/缓存数据分配给该属性,然后在视图中执行此操作:

var model = new ViewModel(@Html.Raw(Json.Encode(Model.ReferenceData)))
ko.applyBindings(model); 

其中Model.ReferenceData 是来自服务的数据。 再次,这工作正常,但是......问题是这样的,然后页面在每次请求时都会将所有 Json 数据转储到其中。 我想为 ReferenceData 使用外部 JS 文件,因为至少它可以被浏览器缓存并减轻未来请求页面的权重。 但是,我想生成 JS 文件的开销并没有那么小,而且——我真正需要的是生成指向该文件的链接,该链接的更改方式与内置的 MVC 捆绑 js 文件的工作方式大致相同– 使用查询字符串生成链接。 我的问题是:有没有一种简单的方法可以做到这一点? 当然,当第一次填充缓存时,我可以生成一个 js 文件并从视图中引用该文件,但正如我所说,每次刷新时都要更改其链接——或者至少确定数据是否在它已经改变了,然后才更新它是问题所在。

对此的任何见解都会有很大帮助

谢谢

纳特

【问题讨论】:

  • 您可以创建一个返回 JSON 对象的操作方法,并使用 ajax 调用它来填充 ko viewmodel。

标签: javascript asp.net-mvc caching knockout.js bundling-and-minification


【解决方案1】:
  1. 版本化 JS 文件(您可以在文件中保留 GUID 本身)。
  2. 在 Application_Start() 中将此版本 ID 获取到静态变量。
  3. 在您的控制器中将此静态变量数据传递给 ViewBag。
  4. 使用此 ID 引用您的脚本

当您重新生成文件时,更新文件中的版本以及您的静态变量。客户端的下一个请求使用新密钥获取新版本。

现在,如果您想在新版本上更新客户端,您必须使用双向协议,例如 Web 套接字或长轮询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    • 2015-10-04
    • 2020-09-05
    • 2011-04-10
    • 2023-03-08
    • 1970-01-01
    • 2013-10-22
    相关资源
    最近更新 更多