I just noticed, this discussion seems to have wondered somewhat off-topic. Mistakes made in my examples didn't help (trying to do too many things at once). So will try to get back on topic.
In comment:1 I was told "We don't document methods that are intended for private use by the widgets" which implies that the demo should not be using a method that is intended for private use by the widgets. Then in comment:2 I am told "_renderItem() is public API, it's just not part of the API exposed via the standard interface." which seems to conflict with the first statement. Is it public/private or what? If it is part of the public API, why is it not documented in the standard API documentation?
As such I find these sorts of statements ... confusing. There are other statements throughout this ticket that I found equally confusing.
It wasn't until comment:6 that somebody thought to mention that the existing data("ui-autocomplete") is changing, to something that looks a lot better.
I am responding here, because this is the logical place to put a response. It doesn't make sense to respond somewhere else, where no one reading the ticket will be able to find it.
I also think there is a concern with making the API stable (1.9 uses data("autocomplete"), 1.10 uses data("ai-autocomplete), 1.11 uses autocomplete( "instance" )), which makes it hard to write libraries that support all versions. Maybe nothing that can be done about this now, hopefully the new method will remain stable. Which like I said, it does seem a much better way of doing it.
For the record (will remain very brief), I have also worked out the problems using .data(...) with https://github.com/crucialfelix/django-ajax-selects, and created a fork to resolve some of its problems https://github.com/brianmay/django-ajax-selects/tree/js - however we were getting lead astray with this discussion, that wasn't the point of this bug report.