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 上使用数组和当前上下文尝试了灰尘示例,它会毫无问题地输出一些东西。我认为问题在于我定义的模型和集合的起点。

我的集合中现在既有 parse 函数又有 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} 获取值,例如,在 Backbone 中。当创建的“事件”对象被推送到某个控制器的内容数组时,类似的东西在 Ember 中起作用,这就是我正在使用的。

于 2013-03-26T20:03:10.927 回答