4

私はMongoDB ドキュメント(MongoLab.com にあります) を呼び出しclientており、これはフィットネス コンテストを追跡するために使用されます。毎週、「体重測定」が行われ、その他の詳細が追跡されます。

私が立ち往生しているのは、ドキュメントにサブドキュメントを追加して、 AngularJSclientを使用して結果を追跡する方法です。

これは、私が見逃している明白で基本的なものかもしれないと感じていますが、新しいフィールドを既存のレコード、配列、または非配列に追加する方法がわかりません。

以下は関連する詳細であると私が信じているものですが、必要に応じて詳細をお尋ねください.

完全なコードはhttp://pastebin.com/4tyRiKusに貼り付けられています

クライアントの例(問題なくクライアントを追加できます)

{
    "_id": {
        "$oid": "50eee69fe4b0e4c1cf20d116"
    },
    "firstName": "Jon",
    "lastName": "Doe"
}

_id( /detail/:cliendId ) を介してデータを取得する別のテンプレート内から動作しますが、計量用のデータ ポイントを追加しようとしています。

<form ng-submit="addWeighIn()">
    <input type="date" ng-model="date" required />
    <input type="text" ng-model="weight" placeholder="Weight" smart-float required />
    <input type="submit" class="btn btn-primary" value="Add" />
</form>

ここで[追加] ボタンをクリックすると、次の部分に進みます。

処理するコントロール内の関数(これは起動し、MongoLab モジュールで update() を呼び出します)

$scope.addWeighIn = function () {
    console.log("addWeighIn: " + $scope.date + " : " + $scope.weight);
    // the below line is obviously wrong, just out of ideas.
    $scope.client.weights = [ { date: $scope.date, weight: $scope.weight } ];
    $scope.client.update(function () {

    });
};

コンソールにはaddWeighIn行が表示され、ネットワーク データはリクエストを送信していることを示していますが、実際にはドキュメントに重みがなく、上記と同じです。

$scope.addWeighIn() から呼び出されたMongoLab リソースと起動

Client.prototype.update = function (cb) {
    console.log("mongolab: update: " + cb);
    return Client.update({ id: this._id.$oid },
        angular.extend({}, this, { _id: undefined }), cb);
};

update() 経由で送信されたデータ(新しい計量データがない)

{
    "_id": {
        "$oid": "50eee69fe4b0e4c1cf20d116"
    },
    "firstName": "Jon",
    "lastName": "Doe"
}

これは実際のデータベースで探しているものですが、重みを追加する必要があり、基本的なことを理解していないと信じています。

{
    "_id": {
        "$oid": "50eee69fe4b0e4c1cf20d116"
    },
    "firstName": "Jon",
    "lastName": "Doe"
    "weights": [
        { "date": "1/3/2013",
          "weight": 155 }
        { "date": "1/10/2013",
          "weight": 150 }
    ]
}

どうしたらよいか、いくつか質問があります。

  1. client.weights.dateに設定するなど、 HTMLコードでこれを宣言的に行うことはできますか? 例:(動作しませんが、同様の方法があるかどうかを確認しています)ng-model<input type="date" ng-model="client.weights.date" required />
  2. 宣言的でない場合、AngularJS を介してこれを行う適切な方法は何ですか?
  3. これについて調べるには、どのような用語を使用すればよいですか? それが私の主な不満のようです。例が見つかりません。

http://docs.mongodb.org/manual/applications/update/で$pushの説明を見つけましたが、これを使用する必要があるかもしれませんが、これをAngularJS の方法で使用する方法がわかりません。

4

1 に答える 1

3

最終的に、問題がMongoLabリソースにあることがわかりました。

悲しい実装をhttps://github.com/pkozlowski-opensource/angularjs-mongolabにあるものと交換したところ、うまくいきました。

例を見つけるのに苦労したので、サブドキュメントを追加する方法を次に示します。

html

<form ng-submit="addWeighIn()">
    <table class="table table-striped">
        <thead>
        <tr>
            <th>Date</th>
            <th>Weight</th>
            <td></td>
        </tr>
        </thead>
        <tbody>
        <tr ng-repeat="weight in client.weighIn | orderBy:'date'">
            <td>{{weight.date}}</td>
            <td>{{weight.weight}}</td>
            <td></td>
        </tr>
        </tbody>
        <tfoot>
        <tr>
            <td>
                <input type="text" ng-model="date" placeholder="Date of weigh-in" required />
            </td>
            <td class="input-append">
                <input type="text" ng-model="weight" placeholder="Weight" smart-float required />
                <span class="add-on">lbs</span>
            </td>
            <td><input type="submit" class="btn btn-primary" value="Add" /></td>
        </tr>
        </tfoot>
    </table>
</form>

脚本

$scope.addWeighIn = function () {
    console.log("addWeighIn: " + $scope.date + " : " + $scope.weight);
    $weighIn = { date: $scope.date, weight: $scope.weight };
    // push to the existing array if it exists
    if ($scope.client.weighIn)
        $scope.client.weighIn.push($weighIn);
    // else create the field if it doesn't exist
    else
        $scope.client.weighIn = [ $weighIn ];

    $scope.client.update(function () {
        // do whatever after the update
    });
};
于 2013-01-11T17:21:00.937 に答える