在asp.net mvc应用程序中扩展Knockout.js ViewModel

时间:2013-02-10 19:09:06

标签: asp.net-mvc knockout.js

我已经让KO与asp.net mvc玩得很好,只需几个简单的步骤:

  1. var jsonModel = @Html.Raw(Json.Encode(Model));
  2. model = ko.mapping.fromJS(jsonModel);
  3. ko.applyBindings(model);
  4. 瞧,我现在可以直接在KO绑定中使用我的服务器端模型。

    <input type="text" data-bind="value: Name" />
    

    如果我想扩展主模型,那很简单:

        model.blurevent = function(o,x) {
            var src = x.srcElement;
            alert(src.value);
        };
    

    接下来,我想扩展模型的子类。例如,我的模型有一个Resume类,它有Employers集合。我想将客户端事件添加到Employer类。

    所以,如果这只是一个纯粹的JavaScript解决方案,我可以做这样的事情:

    function Employer() {
        this.ShowDetais = function() { this.DetailsVisible(true); }
    }
    

    但是,由于我从服务器序列化整个模型(上面的#1),因此未定义Employer。相反,序列化程序只是创建一个匿名集合:

    model = {
    "Resume" : {
      ...
      "Employers": [
      {
        "ResumeEmployerID": 0,
        "Name": "Employer 1",
        "Title": null,
        "EmployedFrom": "\/Date(-62135578800000)\/",
        "EmployedTo": null,
        "GeneralDescription": null,
        "ProjectHighlights": {
    
        }
      }
     }
    

    如您所见,使用默认的json序列化程序,它无需单独定义模型中使用的每个类(在纯javascript应用程序中执行此操作的方式),因此无法扩展子类客户端。

    我想知道这是否已经解决了?是否有一个序列化程序可以创建一个更具可扩展性的更正式的模型?

1 个答案:

答案 0 :(得分:1)

我认为这个插件有望满足您的需求

Knockout Mapping

它应该深度映射你的对象

我认为这个问题有一个很好的例子吗? Knockout.js and mapping plugin not deep translating