0

以下に示すように、JSONを作成しました。オブジェクト内の配列や複雑なJSONの経験がないため、ループスルーしてループオーバーする正しいポイントを定義するのに問題があります。

私が主に探しているのは、コレクションのparse / toJSON部分、またはこの特定の構造で失敗する可能性のある他の場所へのポインターです。

バックボーンとダストを使用して、イベントとタイプ名から値と出力データをループしようとしています。通常、ビューでコレクションを定義することで、JSONをループできます。たとえば、次のように呼び出します。

dust.render("dialog-decoderevents-items", { events : currentUser.eventList.toJSON() }, function(err, out) {
            _this.$(".ab-tvg-prg-opt-future").append($(out));
        });

これにより、通常、ほこりのループを作成して、次のようなデータを出力できます。

{#events}
{#tvProgram}{name}{/tvProgram}
{type}
{/events}

このJSONで配列と現在のコンテキストを使用してダストの例を試しましたが、問題なく出力されます。問題は、モデルとコレクションの開始点として定義するものにあると思います。

現在、コレクションに解析関数とtoJSON関数の両方があります。しかし、モデルでIDとして何を定義するかもわかりません。ご覧のとおり、IDはイベントの内部で定義されており、通常使用する外部では定義されていません。アイデア?すべてのデータは以下のとおりです。

JSON

{
"status": null,
"value": [
{
"event": {
    "id": "RWtzdHJlbSBvcHBkcmFnZWxzZTxsZHR2cGQ+MTM2NDMwMDQwMDAwMDxsZHR2cGQ+MTM2NDMwNDAwMDAwMA==",
    "name": "A glorious event",
    "description": "Some long description about the event",
    "startTime": {
        "year": 2013,
        "month": 3,
        "date": 26,
        "hour": 13,
        "minute": 20,
        "seconds": 0
    },
    "endTime": {
        "year": 2013,
        "month": 3,
        "date": 26,
        "hour": 14,
        "minute": 20,
        "seconds": 0
    }
},
"type": "Party"
},
{
"event": {
    "id": "Rmx5aW5nIFdpbGQgQWxhc2thPGxkdHZwZD4xMzY0MzA2NDAwMDAwPGxkdHZwZD4xMzY0MzEwMDAwMDAw",
    "name": "A glorious event",
    "description": "Some long description about the event",
    "startTime": {
        "year": 2013,
        "month": 3,
        "date": 26,
        "hour": 15,
        "minute": 0,
        "seconds": 0
    },
    "endTime": {
        "year": 2013,
        "month": 3,
        "date": 26,
        "hour": 16,
        "minute": 0,
        "seconds": 0
    }
},
"type": "Birthday"
},
{
"event": {
    "id": "UG9pcm90PGxkdHZwZD4xMzY0MzE2NjAwMDAwPGxkdHZwZD4xMzY0MzE5NjAwMDAw",
    "name": "A glorious event",
    "description": "Some long description about the event",
    "startTime": {
        "year": 2013,
        "month": 3,
        "date": 26,
        "hour": 17,
        "minute": 50,
        "seconds": 0
    },
    "endTime": {
        "year": 2013,
        "month": 3,
        "date": 26,
        "hour": 18,
        "minute": 40,
        "seconds": 0
    }
},
"type": "Birthday"
},
{
"event": {
    "id": "VGhlIEJpZyBCYW5nIFRoZW9yeTxsZHR2cGQ+MTM2NDMxOTAwMDAwMDxsZHR2cGQ+MTM2NDMyMDgwMDAwMA==",
    "name": "A glorious event",
    "description": "Some long description about the event",
    "startTime": {
        "year": 2013,
        "month": 3,
        "date": 26,
        "hour": 18,
        "minute": 30,
        "seconds": 0
    },
    "endTime": {
        "year": 2013,
        "month": 3,
        "date": 26,
        "hour": 19,
        "minute": 0,
        "seconds": 0
    }
},
"type": "Birthday"
}]}

モデル

var mainEvent = Backbone.Model.extend({
    idAttribute : "id",

    defaults : {
        type: null,
        event : {
            id : null,
            name: null,
            description: null,
            channelId: null,
            startTime: null,
            endTime: null
        }
    }

});

コレクション

var eventCollection = Backbone.Collection.extend({
model: mainEvent,

parse : function(json, options) {            
    var retr = [], tmp;

    if (json.status === ajaxStatus.success) {

        switch(options.action) {
              default:
                retr = json.value;
                break;    
        }

        if (options.action === "events") {
            currentUser.eventList = new eventCollection(retr, { action : "events" });
        }

    }
    else if (json.status === ajaxStatus.notAuthenticated) {
        currentUser.trigger("notLoggedIn");
        return [];
    }
    return retr;
},
toJSON : function(){

    var ret = this.constructor.__super__.toJSON.call(this);

    // _.each(ret, function (item) {  
    //     console.log('l1'+item);
    //     ret.push(item);

    // });            
    return ret;
}
});
4

1 に答える 1

1

あなたの問題をすばやく読んだ後のアイデア(私はこれまでほこりや背骨を使ったことがないので、一粒の塩でそれを取ります):

各イベントオブジェクトのコンテンツ配列を格納するコントローラーを作成するだけではいけませんか?そうすれば、JSONファイルを抽出するときに行う必要があるのは、各イベントをコントローラーに追加し、HTMLでそれを繰り返すことだけです。次に、id =event[id]などでIDを抽出できます。

編集:これはAJAXの例です。これを使用していないことはわかっていますが、解析ビットは少なくとも役立つはずです。

function getParties() {
  $.ajax({
    url: 'json/party.json',
    dataType: 'json',
    async: false,
    success: function(data) {
      console.log("Data:", data.value);
      for (var i=0, occurence; occurence = data.value[i]; i++) {
        var event = {};
        event.type = occurence.type;
        for (var key in occurence.event) {
          event[key] = occurence.event[key];
        }
        console.log("Event:", event);
        // Do something with event... Maybe add to content array.
      }
    }
  });
}

これで、「イベント」は単純なjavascriptになります。その中の既知のフィールドにアクセスしたい場合は、たとえばevent["id"]と言うことができます。すべての値を反復処理するには、次のループを使用します。

for (var key in event) {
  console.log("Key: " + key + ", Value: " + event[key]);
}

また、たとえばバックボーンで{id}を使用して値を取得できる必要があります。作成された「イベント」オブジェクトがコントローラーのコンテンツ配列にプッシュされると、Emberでも同様のことが機能します。これは、私が使用しているものです。

于 2013-03-26T20:03:10.927 に答える