2013-12-06 3 views
0

Я пытаюсь расширить элемент jquery с пользовательскими свойствами и функциями, чтобы я мог отслеживать мои элементы и получать их пользовательские свойства в любое время.jQuery объект плагин не является постоянным

на данный момент я сделал это:

jQuery.fn.designerElement = function (tpl, cls) { 
     this.__template = tpl 
     this.des__class = cls; 
     this.compile = function() { 
      this.html(this.__template(this)); 
      return this; 
     } 

     return this; 
    }; 

    var template = Handlebars.compile(
     '<div id="' + +new Date() + '" class="{{des__class}}"></div>' 
); 

    var el = $('<div></div>').designerElement(template, "form-container"); 

    el.attr('id', "test"); 

    el.compile(); 

    $('body').append(el); 

Теперь, если я называю $('#test').compile() это сказать, говорит метод не определен.

Вот скрипку: http://jsfiddle.net/jmorvan/HLVj4/

Чтобы объяснить свой контекст, мне нужны методы и свойства, доступные непосредственно на объекте для некоторых DataBindings работать, вот почему я не могу использовать .data(). Мне показалось, что jquery-плагин будет лучшим подходом, но я определенно чего-то не вижу.

Для того чтобы быть ясным, мне нужно будет иметь доступ к следующим объектам: $('#test').__template, а также функции.

благодарит за ваше время!

ответ

0

Я думаю, вы уже знаете, что происходит, но вот короткое объяснение: С помощью $('#test') вы создаете новый объект jQuery. Он содержит один и тот же элемент, но вы определяете свойства для объекта jQuery, а не для элемента. Так что вы спрашиваете, есть ли способ добавить функциональность к элементу, но с прикрепленным объектом jQuery. В JQuery data() может все-таки можно использовать, чтобы сделать это:

jQuery.fn.designerElement = function (tpl, cls) { 
    this.__template = tpl 
    this.des__class = cls; 
    this.compile = function() { 
     this.html(this.__template(this)); 
     return this; 
    } 
    this.data('this', this); 
    return this; 
}; 

И получить этот объект с:

var test = $('#test').data('this'); 

Вот the fiddle

Другим решением является хранить все эти объекты в глобальном масштабе доступный массив или объект JSON.

+0

благодарит за вас время @jazZRo! К сожалению, как я уже сказал в своем вопросе, '.data' не работает для меня, потому что у него есть функции getter ans setter для доступа к нему, и мои привязки (ember) нуждаются в полностью синтезированном свойстве. Я действительно прыгнул, что есть способ привязать свойства к самому элементу с помощью JQuery. похоже, что последующее решение придется делать. Я сделаю это! – Jmorvan

+0

В JavaScript можно расширить функциональность элемента, используя его свойство прототипа. Я никогда этого не делал, поэтому не могу советовать об этом. Для меня тоже использование глобального массива или объекта JSON выглядит как способ. – jazZRo

+0

Ваше второе решение, безусловно, лучшее, с чем я мог бы работать. Я попытался подключиться к элементу с помощью '$ (el) [0]', но кажется, что jQuery теряет ownPropertie на DOM-манипуляции. – Jmorvan

Смежные вопросы