【问题标题】:Using JSON To Populate UL With jQuery使用 JSON 使用 jQuery 填充 UL
【发布时间】:2012-10-02 14:44:25
【问题描述】:

这是我的 JSON 数据

[
    {"CountyId":2,"Name":"Snohomish","StateId":1,"State":null,"Plans":null},    
    {"CountyId":1,"Name":"Whatcom","StateId":1,"State":null,"Plans":null}
]

我正在尝试使用此数据在我的网页上填充 UL。

function loadSavedCounties() {
    $.post("/Plans/GetPlanCounties/",
        { planId: $("#PlanId").val() },
        function (data) {
            populateSavedCounties($("#SavedCounties"), data);
        }
    );
}
function populateSavedCounties(select, data) {
    select.html('');
    var items = [];
    $.each(data, function (id, option) {
        items.push('<li>' + option.Name + '</li>');
    });  
    select.append(items.join(''));
}

我知道我已成功调用 loadSavedQueries(),因为我的 UL 正在通过 select.html('') 调用清除。但是没有物品被放回 UL。

更新...

在明显的修复和更改不起作用之后,我在控制器中发现了一个问题,该问题没有引发错误,但基本上返回了空的 JSON 对象。一旦我发现了这一点,数据就开始向下流动,建议的更改就成功了。

【问题讨论】:

  • 你需要一个$(select).listview('refresh');
  • 你确定data 是一个数组而不是一个字符串吗?
  • populateSavedCounties 中,将其作为第一行:console.log(typeof data),让我们知道它是什么。

标签: javascript jquery html asp.net-mvc json


【解决方案1】:

你可以在最后设置 UL 的 html - 不需要先清除它:

function populateSavedCounties(select, data) {
    var items = [];
    $.each(data, function (id, option) {
        items.push('<li>' + option.Name + '</li>');
    });  
    select.html(items.join(''));
}

【讨论】:

  • 同样的结果,一个空的
      集。
  • 我明白了...我现在开始怀疑我是否只是出于某种原因没有获取数据...
  • 您的更改确实有效。我没有发布我正在尝试做的全部功能,实际上上游有一个错误阻止 JSON 请求成功完成。一旦我修复了它并修改了你展示的最后一行,那就成功了。谢谢!
【解决方案2】:

这个很简单,我先写代码,然后再回去解释。

脚本

// You obviously know how to use .post
$.post("/Plans/GetPlanCounties/", { planId: $("#PlanId").val() }, function(data) {
    // out of simplicity, i did not create a seperate function, however you seem to know how to move functions around
    // below of course i simply assign a variable for reuse to the element you want
    var $this = $("#SavedCounties").empty();
    // instead of .each, I went on the premise that your data is returned exactly as stated above,
    // in which case, a simple old school for statement is easiest
    for (x in data) {
        // this is real simple, the first part creates a jQuery object of a List Element
        // the text part adds the text too it (aka, html you were wanting)
        // the last part appends the Li to the END of the UL
        $("<li />").text(data[x].Name).appendTo($this);
    };
});

没有cmets的最终结果,很短很甜

$.post("/Plans/GetPlanCounties/", { planId: $("#PlanId").val() }, function(data) {
    var $this = $("#SavedCounties").empty();
    for (x in data) {
        $("<li />").text(data[x].Name).appendTo($this);
    };
});

【讨论】:

  • 您可能不想对数组使用“for...in”循环。如果您加载的任何库向 Array 原型添加了任何内容,则该循环还将对其进行迭代(而不仅仅是数组中的项目)。
  • .each 对函数来说真的很花哨,这是一个愚蠢的说法,如果你有库将数据添加到你的回发中,那么你需要知道如何评估这些添加,否则,检查你的帖子回来了。由于回发通常是某种回声,因此确保数据的完整性并不难。我已经这样做了多年,从来没有看到过不对 json 数据使用简单 for 语句的理由。
  • @SpYk3HH:我只是指出最好在数组上使用“for i”循环而不是“for...in”循环,尤其是在您可能不知道的情况下(或不知道) Array.prototype 是否已被其他来源修改。 stackoverflow.com/a/500531/152168
  • 个人意见,如果你有一个修改你的基本javascript方法的库,转储它!只是我个人的看法,但是在“库”中进行这样的修改是鲁莽和无知的。此外,这仍然没有消除编码人员知道如何解释这种情况的能力。我个人只是发现 for i 循环是陈旧的并且容易发生故障。个人喜好,但每个人都有自己的喜好。
  • 更不用说 for i 可以很长很长,当 for in 简单、容易和简短时!我喜欢短
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-13
  • 1970-01-01
  • 1970-01-01
  • 2011-12-01
  • 1970-01-01
相关资源
最近更新 更多