javascript - Knockout JS 使用 javascript 类型从服务器数据初始化可观察数组

标签 javascript asp.net-mvc asp.net-mvc-3 knockout.js

我正在寻找从某些服务器数据 (ViewBag) 初始化一个可观察数组的最佳方法,我希望数组内容是我定义的 javascript 类型。没有 JS 类型的要求,我可以使用:

materialVarieties: ko.observableArray(@Html.Raw(Json.Encode(ViewBag.Materials)))

但我也有一个我想使用的 Material JS 类型,所以我可以有一些额外的特定于 ViewModel 的属性和函数,即:

var material = function(id, name) {
    this.id = id;
    this.name = name;
    this.selected = ko.observable(false);

    this.select = function()
     {
        jQuery.each(processViewModel.materials(), function(index, item)
        {
            item.selected(false);
        });
        this.selected(true);
      }
}

然后所需的初始化变为:

materialVarieties: ko.observableArray([new material(1, "Apricot"), .....

目前我从 ViewBag 数据构建一个字符串,然后将其呈现为初始化程序,如下所示:

@{ var items = string.Join(",",
                ((IEnumerable<MaterialVariety>) ViewBag.Materials)
                            .Select(m => string.Format("new material({0}, {1})",
                                      Json.Encode(m.Id), Json.Encode(m.Name)))); }

var processViewModel = {
    material: ko.observableArray([@Html.Raw(items)])

但我想知道是否有比 string.Join 位更简洁的方法。我可以将它包装在一个 Helper 中。你是做什么的?

最佳答案

我通常会先序列化数组,然后在将它放入 View 模型时映射它。会像:

var originalVarieties = @Html.Raw(Json.Encode(ViewBag.Materials))

var processViewModel = {
   materialVarieties: ko.observableArray(ko.utils.arrayMap(originalVarieties, function(variety) {
      return new material(variety.id, variety.name);
   }))
}

需要在客户端进行少量额外处理,但看起来比构建字符串更干净。

关于javascript - Knockout JS 使用 javascript 类型从服务器数据初始化可观察数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7048007/

相关文章:

asp.net-mvc - DropDownList用于未选择SelectList中的所选项目

javascript - 为什么在 <table> 单元格中使用 SVG 强制表格为 100% 宽度?

javascript - Canvas 图案不重复

c# - 如何使用 structuremap asp.net mvc 注册可选装饰器或带有可选参数的装饰器?

c# - 检查 Controller 和 View 中的权限

html - 如何使用 Razor 引擎在 View 中为 TextAreaFor 添加最大长度

asp.net - 我*必须*在 MVC3 中覆盖多少 MembershipProvider

javascript - MVC3 Ajax ActionLink 在使用 TempData 完成时调用 javascript 函数

javascript - 在提交表单时使用 ui Binder 中的外部 css 使特定的 div 变灰

javascript - 绑定(bind)多个参数的回调函数