1

Paz的出色回答让我在本周通过自动完成 jQuery UI 交易度过了一个艰难的补丁。

综上所述,如果您的 json 响应中有两个不同的“基础”对象,如何选择正确的 json 响应。

简单地说,我有一个由两个模型组成的 ruby​​ 实例变量,Pitch 和 User。我想根据这个实例变量自动完成。json响应是,比如说

[{"user":{"id":1,"name":"Blah Hugo"}},
{"user":{"id":3,"name":"Blaz Foobar"}},
{"pitch":{"id":2,"name":"Blasters On Business Apparel"}}]

自动完成 javascript 文件现在看起来像这样,它可以工作 < 仅片段 >:

.data( "autocomplete" )._renderItem = function( ul, item ) {
  return jQuery( "<li></li>" )
  .data( "item.autocomplete", item )
  .append( "<a>" + (item.user ? item.user.name : item.pitch.name) + "</a>" )
  .appendTo( ul );
};

我的问题再次是我不得不使用的这个三元组。 item[0].name不起作用,item.item[0].name 如果您不知道两者的名称,是否没有办法获得通用的“用户”或“音高”?

虽然其中一个会。你说什么?

4

2 回答 2

3

我认为您所拥有的并没有太大的问题,但可能会有轻微的改进:

.data("autocomplete")._renderItem = function(ul, item) {
    item = item.user || item.pitch;

    return jQuery("<li></li>")
        .data("item.autocomplete", item)
        .append("<a>" + item.name + "</a>")
        .appendTo(ul);
};
于 2012-04-27T19:10:54.267 回答
1

您可以尝试使用||(logical OR) 来简化您在.append()方法中使用的三元运算符。

这是否符合您的要求?

.data( "autocomplete" )._renderItem = function( ul, item ) {
    item = item.user || item.pitch || {name:""};
    .append( "<a>" + item.name + "</a>" )
    return jQuery( "<li></li>" )
    .data( "item.autocomplete", item )
    .append( "<a>" + item.name  + "</a>" )
    .appendTo( ul );
};

这将返回参数列表中的第一个“非假”值;在这种情况下item.user.nameitem.pitch.name。在这种情况下,如果您的 JSON 对象具有user属性,name则将返回该值。如果 JSON 对象有pitch属性,则name返回该值。如果这两个操作都返回undefined,则将返回一个空白字符串并将其附加到a标签中。

答案提供了有关使用和特殊情况的更多信息,以便在使用“或”方法时牢记在心。

更新:修复null了异常的可能性。

于 2012-04-27T18:06:18.713 回答