Javascript Knockout.js更新数组中的数组
我在敲除视图模型中有一个数组,如下所示:Javascript Knockout.js更新数组中的数组,javascript,model-view-controller,mvvm,knockout.js,Javascript,Model View Controller,Mvvm,Knockout.js,我在敲除视图模型中有一个数组,如下所示: this.Activities = ko.observableArray([ { "date": "28/11/2012 00:00:00", "activities": [ { "company": "BOW", "description": "Backup Checks", "length": "60" }, { "company": "AMS", "description"
this.Activities = ko.observableArray([
{ "date": "28/11/2012 00:00:00",
"activities": [
{ "company": "BOW",
"description": "Backup Checks",
"length": "60"
},
{ "company": "AMS",
"description": "Data Request",
"length": "135"
},
]},
{ "date": "30/11/2012 00:00:00",
"activities": [
{ "company": "BOW",
"description": "Backup Checks",
"length": "60"
},
{ "company": "SLGT",
"description": "Software Development",
"length": "240"
},
{ "company": "BOW",
"description": "Data Request",
"length": "30"
},
]},
]);
我使用此代码向其中添加新元素:
this.Activities.push(new NewActivity(company, description, length, fullDate));
它使用NewActivity函数:
function NewActivity(company, description, length, date) {
this.date = date;
this.activities = [{ "company": company, "description": description, "length": length }];
}
而且效果很好。但是,每次释放时,它都会创建一个全新的对象。我需要实现一个条件,当代码检查已经创建的对象的日期时。如果新创建的对象具有相同的日期,则应将活动详细信息添加到该日期的活动数组中的活动数组中
我该怎么做?
Activities数组的所有数据都来自MVC应用程序中强类型视图中的模型:
this.Activities = ko.observableArray([
@foreach (ActivitySet aSet in Model)
{
@:{ "date": "@aSet.Date",
@:"activities": [
foreach(Activity a in aSet.Activities)
{
@:{ "company": "@a.Companies.Select(c => c.Title).Single()",
@:"description": "@a.Descriptions.Select(c => c.Title).Single()",
@:"length": "@a.LengthInMinutes"
@:},
}
@:]},
}
]);
我建议您创建几个实体来描述您的活动:
// Details
function ActivityDetails(company, description, length) {
this.company = ko.observable(company);
this.description = ko.observable(description);
this.length = ko.observable(length);
}
// Activity
function Activity(date, activityDetails) {
this.date = ko.observable(date);
this.details = ko.observableArray(activityDetails);
}
您可以通过以下方式控制活动:
function ViewModel () {
var self = this;
this.Activities = ko.observableArray([
// Activities here
]);
this.addActivity = function (activity) {
var flag = false;
ko.utils.arrayMap(self.Activities(), function (item) {
// Flag is here so it doesn't keep checking further in iterations
if (!flag) {
if (item.date() === activity.date()) {
item.details.push(activity.details);
flag = true;
}
}
});
// Case where activity date was not found in existing records
if (!flag) {
self.Activities.push(activity);
}
}
}
这要求您的视图模型有一个自定义的add方法,我提供了一个示例。请注意,无论我在哪里解析可观察值,因此如果您使用的是不可观察值,请删除函数调用 谢谢,我试试看。看起来很有希望我明白你答案背后的逻辑。不幸的是,AddActivity函数对我不起作用。这一行没有执行:ko.utils.arrayMap(self.Activities,function(item)代码只是传递它而没有进入函数!@Bartosz是的,它应该是self.Activities()而不是self.Activities。更正了答案。是的,我自己找到了它,但它仍然不适用于我。因此我找到了另一个解决方案:ko.utils.arrayForEach(this.Activities(),function(feature){if(feature.date==activity.date()){feature.details.push(new ActivityDetails(company,description,length));flag=true;}});这次push方法对我不起作用!?%##"^~~# WHYYY@Bartosz据我所见,根据代码,日期是不可观察的。如果不可观察,则使用feature.date,否则使用feature.date()。在我提供的代码示例中,有什么不起作用?