Reputation: 9577
The excellent answer by Paz got me through a rough patch this week with the autocomplete jQuery UI deal.
All that to say, How does one choose the correct json response if the you have two different "base" objects in your json response.
Simply put, I have a ruby instance variable made up of two models, Pitch and User. I want to autocomplete based on this instance variable. The json response is, say
[{"user":{"id":1,"name":"Blah Hugo"}},
{"user":{"id":3,"name":"Blaz Foobar"}},
{"pitch":{"id":2,"name":"Blasters On Business Apparel"}}]
The autocomplete javascript file looks like this NOW, and it works < snippet only >:
.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 );
};
Again my problem is this ternary i had to use. item[0].name
doesn't work, nor did item.item[0].name
Is there no way to get the generic 'user' or 'pitch' if you don't know the name of either?
I'd have though one of them would. What says you?
Upvotes: 1
Views: 464
Reputation: 7863
You could try using the ||
(logical OR) to sort of short hand your ternary operator you have in the .append()
method.
Does this do what you want it to?
.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 );
};
This will return the first "non-false" value in the list of arguments; in this case item.user.name
and item.pitch.name
. In this case, if your JSON object has a user
property, the name
value will be returned. If the JSON object has a pitch
property, the name
value will be returned. If both of those operations return undefined
, a blank string will be returned and appended into the a
tag.
This answer gives more information about use and special cases to keep in the back of your mind when using using the 'OR' method.
UPDATE: Fixed null
exception possibility.
Upvotes: 1
Reputation: 126072
I don't think there's much wrong with what you have, but maybe a slight improvement would be:
.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);
};
Upvotes: 3