2013-06-17 2 views
1

Я хочу добавить HTML-код через JavaScript и добавить на него события click. Поскольку я не хочу писать HTML в JavaScript, у меня есть HTML-фрагменты в моем HTML-шаблоне, внутри тегов <script type="text/html">, и я хочу обернуть их в классы (чтобы он выглядел лучше и чтобы я мог лучше проверить функциональность) ,Как правильно подкласс jQuery в CoffeeScript?

В моем примере, у меня есть шаблон с

<script type="text/html" id="remove-choice-button">         
    <span class="close">×</span> 
</script> 

В моем файле CoffeeScript, у меня есть

class RemoveChoiceButton extends jQuery 
    constructor: -> 
    super($("#remove-choice-button").html().trim()) 

Но, если я пытаюсь добавить его в DOM, это не потому что это происходит:

jQuery -> 

    console.log new RemoveChoiceButton().html() 
    //=> undefined 

Где я совершил ошибку?

+1

Возможно, это только опечатка в вашем вопросе, но 'console.log (new RemoveChoiceButton()). Html()', вероятно, не делает то, что вы думаете. –

+0

Исправлено. Это все еще не работает. –

+0

Btw, разве это не то же самое, что в Ruby, что если вы помещаете пробел перед скобками, то они больше не для аргументов? –

ответ

2

Я не верю, что jQuery работает как обычный класс. Это более функционально, чем это. Вы не instance = new jQuery() никогда. Javascript позволяет использовать основанные на классе парадигмы, но вы не можете предположить, что все работает именно так.

Вместо этого наследуйте класс от ничего и просто использовать jQuery. И предоставить метод для этого класса, чтобы вернуть объект jQuery.

class RemoveChoiceButton extends jQuery 
    constructor: -> 
    @el = $("#remove-choice-button") # el for DOM *el*ement 

    getContent: -> 
    @el.html().trim() 

console.log new RemoveChoiceButton().getContent() 
# or 
console.log new RemoveChoiceButton().el.html() 

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

makeRemoveChoiceButton = -> 
    $($("#remove-choice-button").html().trim()) 
+0

'jQuery()' является расширенным конструктором, но все же конструктором, и вы определенно можете называть его с помощью 'new' (хотя вы правы, он не очень сильно виден в фактическом коде). Fiddle [здесь] (http://jsfiddle.net/eS4Dr/). –

+0

@ FrédéricHamidi, что бы «новый jQuery» сделал? Я предполагаю, что он просто игнорирует его содержимое и действует так, как будто он был вызван без 'нового'. –

+0

@Jan, да, IIRC в любом случае возвращает новый объект, поэтому изменения в 'this' внутри него теряются при вызове с' new'. Я дважды проверю. * Edit: * Double-checked, in 1.10.1 'jQuery()' всегда возвращает 'new jQuery.fn.init (селектор, контекст, rootjQuery) ', поэтому он действительно работает одинаково независимо от того, вызван ли он в контексте конструктора или нет. –

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