1

を使用してカレンダーを作成したいのですがAngularJS、モデルは次のようなオブジェクトです。

$scope.model = {
        weeks: [
                {
                    days: [
                    null,
                    {
                        name: "3 dec",
                        toDoItems: [{ name: "Task 1" }, { name: "Task 2"}]
                    },
                    {
                        name: "4 dec",
                        toDoItems: [{name: "Task 1"}, {name: "Task 2"}]
                    }
                ]
                },
                {
                    days: [
                    null,
                    {
                        name: "5 dec",
                        toDoItems: [{ name: "Task 1" }, { name: "Task 2"}]
                    },
                    {
                        name: "6 dec",
                        toDoItems: [{name: "Task 1"}, {name: "Task 2"}]
                    }
                ]
                }

            ]
           }

しかし、オブジェクトを動的に作成したい。

このようなことを試しましたが、次のエラーが表示されます。

TypeError: Cannot call method 'push' of undefined



 $scope.fillMonth = function () {
        var gap = dayInWeek($scope.year.value, $scope.month, 1),
            nrOfDays = daysInMonth($scope.year.value, $scope.month);

        $scope.model = {};

        for (var i = 0; i < (nrOfDays + gap) % 7; i++) {
            for (var j = 0; j < 7; j++) {
                if (j === 0)
                    $scope.model.weeks.push([]);

                if (i === 0 && j < gap)
                    $scope.model.weeks[i].days.push(null);

                else
                    $scope.model.weeks[i].days.push([{ name: i + ' ' + j, toDoItems: [{ name: "Task 1" }, { name: "Task 2"}]}]);
            }
        }
    }

誰でもこれで私を助けることができますか?前もって感謝します!

4

2 に答える 2

6

問題は、それweeksが存在しないことです。最初に次のように作成する必要があります。

$scope.model = {};//new object
$scope.model.weeks = [];//new array

その後、空の配列をプッシュするのではなく、日の配列を含む新しいオブジェクトをプッシュします。

var weeksObj = {};//new object
weeksObj.days = [];//new array
$scope.model.weeks.push(weeksObj);

その後、null の場合、次のように日の値をプッシュできます。

weeksObj.days.push(null);

そしてあなたの日のオブジェクトのために、再び新しいオブジェクトを作成します:

var dayObj = {};//new object
dayObj.name = "name";//set name property
dayObj.toDoItems = [];//new array
weeksObj.days.push(dayObj);

問題がどこにあるかを確認するのに役立つことを願っています。{}オブジェクト ( ) と配列 ( ) の間で少し混乱しているようです[]。push メソッドを持つのは配列だけです

于 2013-09-30T15:46:26.250 に答える
1

ループでは、空の配列をプッシュせずに、週を空の配列に設定します。day で最初のオブジェクトを作成することを忘れないでください

    for (var i = 0; i < (nrOfDays + gap) % 7; i++) {
        for (var j = 0; j < 7; j++) {
            if (j === 0)
                $scope.model.weeks = [];

            if (i === 0 && j < gap)
                $scope.model.weeks[i] = {day: [null]};

            else
                $scope.model.weeks[i].days.push([{ name: i + ' ' + j, toDoItems: [{ name: "Task 1" }, { name: "Task 2"}]}]);
        }
    }
于 2013-09-30T15:49:04.270 に答える