我正在使用requireJS创建一个MVC3应用程序。在我的视图中,我需要将Model对象转换为knockout viewmodel对象。所以我需要使用knockout和knockout.mapping库。
我的应用程序按以下方式设计,
1)。所有脚本文件都归类为文件夹
2)。在“_Layout.cshtml”中,我正在引用“require.js”。
<script src="@Url.Content("~/Scripts/lib/require.js")" type="text/javascript"></script>
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"
}
});
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 };
});
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);
}
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>
我面临的问题是加载index.js文件时,我收到一个脚本错误,无法加载knockout.js。
无法加载资源:服务器响应状态为404(未找到) - http:///Scripts/knockout.js
但是如果我删除“index.js”文件中“komapping”的依赖项,它会正确加载,但是我无法使用映射功能。
我查看了这些链接,但找不到解决方案, Knockout.js mapping plugin with require.js和 https://github.com/SteveSanderson/knockout.mapping/issues/57
非常感谢您的帮助,建议。谢谢!
答案 0 :(得分:19)
我有同样的问题。问题是knockout.mapping定义了一个敲除依赖项,因此在加载脚本时需要满足这个要求。
以下是加载地图内容的方法
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'
}
}
});
然后就我而言,我使用带有requirejs调用的index.js文件,如下所示
requirejs(['jquery', 'knockout', 'komapping'], function($, ko, komapping){
ko.mapping = komapping;
//Do other stuff here
});