使用require.js加载"knockout.mapping"插件

Che*_*nga 6 requirejs asp.net-mvc-3

我正在使用requireJS创建一个MVC3应用程序.在我的视图中,我需要将Model对象转换为knockout viewmodel对象.所以我需要使用knockout和knockout.mapping库.

我的应用程序是按以下方式设计的,

1).所有脚本文件都归类到文件夹中

  • Scripts/app/home/ - 包含Home控制器中视图的脚本.
  • Scripts/lib/ - 包含jQuery,knockout,knockout.mapping,requirejs等脚本

2).在"_Layout.cshtml"中,我正在引用"require.js".

<script src="@Url.Content("~/Scripts/lib/require.js")" type="text/javascript"></script>
Run Code Online (Sandbox Code Playgroud)

3).要配置require.js设置,我使用的是另一个名为"common.js"的脚本文件(Scripts/lib/common.js)

require.config(
{
    baseUrl: "/Scripts/",
    paths:{
            jquery: "lib/jquery-2.0.3",
            ko: "lib/knockout-2.3.0",
            komapping: "lib/knockout.mapping"
        }
});
Run Code Online (Sandbox Code Playgroud)

4).这是我的index.js文件,位于'Scripts/app/home /"中

define(['ko', 'komapping'], function (ko, komapping) {

var person = function () {
    var self = this;
    self.getPersonViewModel = function (data) {
        return ko.mapping.fromJS(data); ;
    };

};
return { Person: person };
Run Code Online (Sandbox Code Playgroud)

});

5).这是"Home"控制器中的"索引"操作方法

public ActionResult Index()
    {
        var person = new Person
        {
            Id = 1,
            Name = "John",
            Addresses = new List<Address>(new[]{new Address{Country = "Country 1", City = "City 1"}})
        };

        return View(person);
    }
Run Code Online (Sandbox Code Playgroud)

6).最后这是我的"索引"视图

@model MMS.Web.Models.Person

<script type="text/javascript">

require(["/Scripts/common/common.js"], function () {

            require(["app/home/index"], function (indexJS) {
                var person = new indexJS.Person();
                var vm = person.getPersonViewModel(@Html.Raw(Json.Encode(Model)));
            });
});
</script>
Run Code Online (Sandbox Code Playgroud)

我面临的问题是加载index.js文件时,我得到一个脚本错误,无法加载knockout.js.

无法加载资源:服务器响应状态为404(未找到) - http:///Scripts/knockout.js

但是,如果我删除"index.js"文件中"komapping"的依赖项,它会正确加载,但是我无法使用映射功能.

我查看了这些链接,但找不到解决方案, Knockout.js映射插件与require.jshttps://github.com/SteveSanderson/knockout.mapping/issues/57

非常感谢您的帮助,建议.谢谢!

his*_*_py 19

我遇到过同样的问题.问题是knockout.mapping定义了一个knockout依赖项,所以你需要在加载脚本时满足这个.

这是你应该如何加载你的映射的东西

require.config(
{
    baseUrl: "/Scripts/",
    paths:{
        jquery: "lib/jquery-2.0.3",
        knockout: "lib/knockout-2.3.0",
        komapping: "lib/knockout.mapping"
    },
    shim: {
        komapping: {
            deps: ['knockout'],
            exports: 'komapping'
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

然后就我而言,我使用带有requirejs调用的index.js文件,如下所示

requirejs(['jquery', 'knockout', 'komapping'], function($, ko, komapping){
    ko.mapping = komapping;
    //Do other stuff here
});
Run Code Online (Sandbox Code Playgroud)