JQuery Datalink - связывание данных
Я опробовал предложение по связыванию данных jQuery от Microsoft и заметил нечто странное.
Мои объекты получают это дополнительное свойство, и мне было интересно, какова причина этого. Сначала я подумал, что сделал ошибку, но заметил, что их демо-страница делает то же самое
Это результат json моих объектов:
[{
"propertyName":"ProductNamese",
"controlType":"Text",
"jQuery1274021322131":6
},
{
"propertyName":"Price",
"controlType":"Number",
"jQuery1274021322131":9
},
{
"propertyName":"Description",
"controlType":"TextArea",
"jQuery1274021322131":12
}
]
Свойство, о котором я говорю, это "jQuery1274021322131".
2 ответа
Когда вы приводите объект DOM к объекту jQuery (т.е. $("#SomeElementID")
), jQuery добавляет к объекту специальное свойство "expando". Я считаю, что это свойство используется библиотекой внутри, чтобы помочь кэшировать элемент во внутреннем массиве для более быстрого доступа.
Пролистывая библиотеку, это код, который создает это значение и как он используется внутри:
var expando = "jQuery" + now(), uuid = 0, windowData = {};
jQuery.extend({
cache: {},
data: function( elem, name, data ) {
elem = elem == window ?
windowData :
elem;
var id = elem[ expando ];
// Compute a unique ID for the element
if ( !id )
id = elem[ expando ] = ++uuid;
// Only generate the data cache if we're
// trying to access or manipulate it
if ( name && !jQuery.cache[ id ] )
jQuery.cache[ id ] = {};
// Prevent overriding the named cache with undefined values
if ( data !== undefined )
jQuery.cache[ id ][ name ] = data;
// Return the named cache data, or the ID for the element
return name ?
jQuery.cache[ id ][ name ] :
id;
},
// snipped
jQuery использует expando, чтобы связать объект (элемент dom или другой) с его кешем данных при использовании метода data() (это НЕ вызвано просто выполнением на нем $(), как указано в принятом ответе). Плагин связывания данных использует data() на объекте, создавая, таким образом, команду expando. К сожалению, экспансия настолько "регулярна" - ее легче скрыть. Например, это должна быть инкапсулированная функция, чтобы сериализаторы JSON ее не включали. jQuery работает с обычными объектами, но есть некоторые грубые края, как этот. Надеюсь, они могут быть устранены в будущем.