Knockoutjs 使用 MVC 从服务器填充数据
Knockoutjs populating data from server with MVC
我正在尝试使用来自服务器的一些初始值填充 knockoutjs viewmodel,我正在使用 ASP.Net MVC,所以我这样做的方式是将 mvc viewmodel 传递给视图:
public ActionResult Edit(int cvId)
{
CV cv = repository.FindCV(cvId);
//auto mapper mapping
Mapper.CreateMap<CV, MyCVViewModel>();
Mapper.CreateMap<Company, MyCompanyViewModel>();
Mapper.CreateMap<Education, MyEducationViewModel>();
Mapper.CreateMap<Reference, MyReferenceViewModel>();
var model = Mapper.Map<CV, MyCVViewModel>(cv);
return View(model);
}
在视图中,我将视图模型转换为 json 字符串并将其绑定到 knockoutjs 视图模型,因此它会填充数据:
//mvc viewmodel
@model Taw.WebUI.Models.MyCVViewModel
//convert
@{
var json = @Html.Raw(Model.ToJson());
}
//lastly bind
<script type="text/javascript">
// Activate knockout binding
var viewModel = new CVViewModel(@json);
ko.applyBindings(viewModel);
</script>
在我的挖空 javascript 中,我用数据填充了挖空视图模型:
var CVViewModel = function (data) {
var self = this;
//list view model
self.title = ko.observable(data.title);
self.statement = ko.observable(data.statement);
self.reference = ko.observable(data.reference);
self.companies = ko.observableArray(data.companies);
self.educations = ko.observableArray(data.educations);
self.references = ko.observableArray(data.references);
}
一切都在这个阶段被填充:
生成的 json 字符串是:
问题:
1.问题是有些值在我更改时不绑定,只有标题和语句更改:
结果json,如您所见,只有标题和声明发生变化,公司内部的价值观没有变化
2。再次保存这些数据时,如何让服务器端知道已编辑和删除的内容,如何使用 MVC 和 entity framework 跟踪它们,并相应地更改数据库
更新
我的淘汰赛javascript,我已经定义了这些observables,如何在observablearray
中定义它们
function Company() {
this.companyName = ko.observable();
this.jobTitle = ko.observable();
this.description = ko.observable();
this.startDate = ko.observable();
this.endDate = ko.observable();
}
问题是您正在尝试更新 ObservableArray 中的项目。 ObservableArray 所做的就是为您维护数组模型,这意味着如果您在公司中添加或删除某些可观察的内容,它将反映在数组中。
为了对数组项进行更改,您需要将 ObservableArray 中的每个项都设为 Observable。
在这里 post 看看这个:
https://www.airpair.com/knockout/posts/top-10-mistakes-knockoutjs#8-observable-arrays-don-t-automatically-have-observable-members
第一个问题:
问题是您需要为每个数组项使用 ko.observable
。
例如:jsfiddle
function CVViewModel(data) {
var self = this;
//list view model
self.title = ko.observable(data.title);
self.companies = ko.observableArray(data.companies.map(Company));
}
function Company(data) {
if (!(this instanceof Company)){
return new Company(data);
}
this.companyName = ko.observable(data.companyName || '');
this.jobTitle = ko.observable(data.jobTitle || '');
this.description = ko.observable(data.description || '');
this.startDate = ko.observable(new Date(data.startDate) || '');
this.endDate = ko.observable(new Date(data.endDate) || '');
}
现在,当您将公司可观察对象绑定到 UI 视图模型上的每个数组元素时,它们将保持同步。
关于你的第二个问题,我建议使用像 breeze.js which does the change tracking for you. Breeze.js has a tutorial 这样的 ORM,它使用 knockout.js.
我正在尝试使用来自服务器的一些初始值填充 knockoutjs viewmodel,我正在使用 ASP.Net MVC,所以我这样做的方式是将 mvc viewmodel 传递给视图:
public ActionResult Edit(int cvId)
{
CV cv = repository.FindCV(cvId);
//auto mapper mapping
Mapper.CreateMap<CV, MyCVViewModel>();
Mapper.CreateMap<Company, MyCompanyViewModel>();
Mapper.CreateMap<Education, MyEducationViewModel>();
Mapper.CreateMap<Reference, MyReferenceViewModel>();
var model = Mapper.Map<CV, MyCVViewModel>(cv);
return View(model);
}
在视图中,我将视图模型转换为 json 字符串并将其绑定到 knockoutjs 视图模型,因此它会填充数据:
//mvc viewmodel
@model Taw.WebUI.Models.MyCVViewModel
//convert
@{
var json = @Html.Raw(Model.ToJson());
}
//lastly bind
<script type="text/javascript">
// Activate knockout binding
var viewModel = new CVViewModel(@json);
ko.applyBindings(viewModel);
</script>
在我的挖空 javascript 中,我用数据填充了挖空视图模型:
var CVViewModel = function (data) {
var self = this;
//list view model
self.title = ko.observable(data.title);
self.statement = ko.observable(data.statement);
self.reference = ko.observable(data.reference);
self.companies = ko.observableArray(data.companies);
self.educations = ko.observableArray(data.educations);
self.references = ko.observableArray(data.references);
}
一切都在这个阶段被填充:
生成的 json 字符串是:
问题:
1.问题是有些值在我更改时不绑定,只有标题和语句更改:
结果json,如您所见,只有标题和声明发生变化,公司内部的价值观没有变化
2。再次保存这些数据时,如何让服务器端知道已编辑和删除的内容,如何使用 MVC 和 entity framework 跟踪它们,并相应地更改数据库
更新
我的淘汰赛javascript,我已经定义了这些observables,如何在observablearray
中定义它们function Company() {
this.companyName = ko.observable();
this.jobTitle = ko.observable();
this.description = ko.observable();
this.startDate = ko.observable();
this.endDate = ko.observable();
}
问题是您正在尝试更新 ObservableArray 中的项目。 ObservableArray 所做的就是为您维护数组模型,这意味着如果您在公司中添加或删除某些可观察的内容,它将反映在数组中。 为了对数组项进行更改,您需要将 ObservableArray 中的每个项都设为 Observable。
在这里 post 看看这个: https://www.airpair.com/knockout/posts/top-10-mistakes-knockoutjs#8-observable-arrays-don-t-automatically-have-observable-members
第一个问题:
问题是您需要为每个数组项使用 ko.observable
。
例如:jsfiddle
function CVViewModel(data) {
var self = this;
//list view model
self.title = ko.observable(data.title);
self.companies = ko.observableArray(data.companies.map(Company));
}
function Company(data) {
if (!(this instanceof Company)){
return new Company(data);
}
this.companyName = ko.observable(data.companyName || '');
this.jobTitle = ko.observable(data.jobTitle || '');
this.description = ko.observable(data.description || '');
this.startDate = ko.observable(new Date(data.startDate) || '');
this.endDate = ko.observable(new Date(data.endDate) || '');
}
现在,当您将公司可观察对象绑定到 UI 视图模型上的每个数组元素时,它们将保持同步。
关于你的第二个问题,我建议使用像 breeze.js which does the change tracking for you. Breeze.js has a tutorial 这样的 ORM,它使用 knockout.js.