3

ノックアウトビューモデルに次のような配列があります。

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"
                     @:},
                 }
            @:]},
        }
]);
4

1 に答える 1

4

アクティビティを説明するいくつかのエンティティを作成することをお勧めします。

// 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 メソッドが必要です。どこでも観測可能な値を解決していることに注意してください。したがって、観測できない値を使用している場合は、関数呼び出しを削除してください。

于 2012-11-30T12:57:21.587 に答える