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 работает с обычными объектами, но есть некоторые грубые края, как этот. Надеюсь, они могут быть устранены в будущем.

Другие вопросы по тегам