2013-07-23 48 views
6

我正在用requireJS创建一个MVC3应用程序。在我的观点中,我需要将Model对象转换为一个knockout viewmodel对象。所以我需要使用knockout和knockout.mapping库。使用require.js加载“knockout.mapping”插件

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

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

  • 脚本/应用/主页/ - 包含了Home控制器的意见脚本。
  • 脚本/ LIB/- 包含如jQuery,敲除,knockout.mapping,requirejs等

2)的脚本。在“_Layout.cshtml”中,我引用了像这样的“require.js”。

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

3)。配置我使用所谓的 “common.js”(脚本/ 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)不同的脚本文件require.js设置。这是我的index.js文件,该文件是在“脚本/应用/主页/”

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)这是我的‘家‘控制器

指数’中的行动方法’
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

但如果我删除 “komapping” 的依赖在“index.js”文件中它正确加载,但是我不能使用映射功能。

我看看这些环节里面,也没有找到一个解决方案, Knockout.js mapping plugin with require.jshttps://github.com/SteveSanderson/knockout.mapping/issues/57

您的帮助,建议都非常赞赏。谢谢!

回答

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' 
     } 
    } 
}); 

然后在我的情况下,我使用一个索引加载映射的东西。js文件,如下所示requirejs调用

requirejs(['jquery', 'knockout', 'komapping'], function($, ko, komapping){ 
    ko.mapping = komapping; 
    //Do other stuff here 
}); 
+0

Hi Hisa,谢谢! – Cheranga

+0

http://stackoverflow.com/questions/18925717/knockout-mapping-require-js-bug。我试过使用这个解决方案,但得到错误。 – jmogera