gpt4 book ai didi

javascript - knockout 映射和 foreach 数据绑定(bind)在带有按钮的表上,缺少对 View 模型的引用?

转载 作者:行者123 更新时间:2023-11-30 06:33:54 24 4
gpt4 key购买 nike

我结合knockout使用mvc4和entityframework。我也使用 knockout 映射。但是我遇到了一个无法解决的问题。

我想要实现的目标:

  • 用户点击删除按钮从表中删除行。 [有效]
  • 调用 mvc Controller 上的 delete 操作方法实际删除数据数据库。 [有效]
  • 发回包含新更改数据的新 Json 对象 table 。 [有效]
  • 在我的 knockout View 模型中加载新数据并使用 ko.mapping.fromJS() 和 ko.applyBindings() 更新 UI [不工作,我真的迷失在这里]

看起来我完全失去了对我用于数据绑定(bind)和 foreach 我的表的体验列表的引用。我认为这与我在 foreach 循环中调用 deletemethod 的方式有关。

看起来 var self = this; 的 javascript“技巧”也无法让我引用正确的数据。

下面是我现在使用的代码,目的是让大家更好地了解情况。如果需要更多信息,请告诉我。

这些是我的 mvc View 模型:

public class ExperienceOverviewModel
{
public ExperienceModel selectedExperience { get; set; }
public List<ExperienceModel> Experiences { get; set; }
}

public class ExperienceModel
{
public int ExperienceId { get; set; }
public DateTime DateFrom { get; set; }
public DateTime DateUntil { get; set; }
public string Description { get; set; }
public string Employer { get; set; }
public decimal Hours { get; set; }
public int PersonId { get; set; }
public bool? Secondment { get; set; }
public string Title { get; set; }
}

这是我的表格,我在其中使用 knockout 对每个数据进行数据绑定(bind):

</table>
<thead>
</thead>
<tbody data-bind="foreach: Experiences()">
<tr>
<td data-bind="text: Employer"></td>
<td data-bind="text: Description"></td>
<td data-bind="text: DateFrom"></td>
<td data-bind="text: DateUntil"></td>
<td data-bind="text: Secondment"></td>
<td>
<a href="#" data-bind="click: function(data, event){ $root.EditExperienceModal(data); }"><i class="icon-edit"></i></a>
</td>
<td>
<a href="#" data-bind="click: function(data, event){ $root.ConfirmDeleteExperienceModal(data);}"><i class="icon-remove"></i></a>
</td>
</tr>
</tbody>
</table>

我想在其中调用 ko.mapping.fromJS() 和 ko.applyBindings() 的 knockout viewmodel... 开始吧...

    function ViewModel() {
this.DeleteExperience = function (experience) {

$.ajax({
type: "post",
contentType: "application/json",
url: "/Experienced/Delete/" + this.selectedExperience.ExperienceId(),
data: ko.toJSON(self.selectedExperience),
error: function (xhr, status, error) {
},
success: function (response) {

ko.mapping.fromJS(response, ?? this.Experiences ??); <---- ???
ko.applyBindings(?????); <---- ???

}
});
}
}

$(function () {
var jsonModel = '@Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(this.Model, new Newtonsoft.Json.Converters.IsoDateTimeConverter()))';
var mvcModel = ko.mapping.fromJSON(jsonModel);

var myViewModel = new ViewModel();
g = ko.mapping.fromJS(myViewModel, mvcModel);
ko.applyBindings(g);
});

* -- 已更新 -- *

为了更清楚地说明,这里是我简单化的内容:当我从 AJAX 调用返回结果时,出现以下错误:

Object # has no method 'Experiences'

<table class="table table-striped">
<tbody data-bind="foreach: Experiences()">
<tr>
<td data-bind="text: Employer"></td>
<td data-bind="text: Description"></td>
<td data-bind="text: DateFrom"></td>
<td data-bind="text: DateUntill"></td>
<td data-bind="text: Secondment"></td>
<td>
<a href="#" data-bind="click: $root.DeleteExperience"><i class="icon-remove"></i></a>

</td>
</tr>
</tbody>
</table>
<script type="text/javascript">

function ViewModel() {
var self = this;

self.DeleteExperience = function (experience) {
$.ajax({
type: "post",
contentType: "application/json",
url: "/Experienced/Delete/" + experience.ExperienceId(),
data: ko.toJSON(experience),
error: function (xhr, status, error) {
console.log(error);
},
success: function (response) {
$('#confirmDeleteModal').modal('hide');
self.UpdateExperienceList(response);
}
});
}

self.UpdateExperienceList = function (data) {
self.Experiences(data); <---- ?????
}
}

$(function () {
var jsonModel = '@Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(this.Model, new Newtonsoft.Json.Converters.IsoDateTimeConverter()))';
var mvcModel = ko.mapping.fromJSON(jsonModel);
var myViewModel = new ViewModel();
g = ko.mapping.fromJS(myViewModel, mvcModel);
ko.applyBindings(g);
});
</script>

最佳答案

在您的 self.UpdateExperienceList 函数中,尝试以下操作:

self.UpdateExperienceList = function(data) {
ko.mapping.fromJSON(data, {}, self);
};

这将根据来自服务器的数据更新 self 对象的属性。

您最初创建的 View 模型在我看来也是错误的。我本来希望你想要更像下面的东西:

var myViewModel = ko.mapping.fromJSON(jsonModel, {}, new ViewModel());

关于javascript - knockout 映射和 foreach 数据绑定(bind)在带有按钮的表上,缺少对 View 模型的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15897629/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com