2013-07-07 1 views
1

У меня возникли проблемы с загрузкой сценариев конца страницы (или другого содержимого) из моего файла макета после вызова «@content». ' Я использую tempating для кофеина и имею следующий файл макета default.html.coffee.Включая скрипты/содержимое в файл макета документа Copcup Docpad после ссылки на переменную данных шаблона контента.

doctype 5 
html -> 

    head -> 

    meta(charset:"utf-8") 
    title("Docpad") 
    if @document.description? 
     meta(name:"description", content:@document.description) 

    stylesheets = ['/styles/app.css'] 
    @getBlock('styles').add(stylesheets).toHTML() 

    body -> 

    div class:"row", -> 
     div class:"large-12 columns", -> 
     h1(class:"docs header", "Header") 
     hr() 

    @content 
    @getBlock('scripts').toHTML() 

Проблема Я бегу в к тому, что «@content» правильно дает и делает страницу конкретного содержания, только если ничего не следует за ним (если) линии @getBlock («сценарии» выше, например, удаляется или комментируется). Однако с помощью вышеприведенного кода вызов getBlock для скриптов завершается успешно, но «@content» не вставляет содержимое. Любая помощь приветствуется, спасибо.

ответ

1

Давайте посмотрим на скомпилированный javascript вашего кода. Мы можем использовать компилятор на coffeescript.org, чтобы сделать это:

doctype(5); 

html(function() { 
    head(function() { 
    var stylesheets; 
    meta({ 
     charset: "utf-8" 
    }); 
    title("Docpad"); 
    if (this.document.description != null) { 
     meta({ 
     name: "description", 
     content: this.document.description 
     }); 
    } 
    stylesheets = ['/styles/app.css']; 
    return this.getBlock('styles').add(stylesheets).toHTML(); 
    }); 
    return body(function() { 
    div({ 
     "class": "row" 
    }, function() { 
     return div({ 
     "class": "large-12 columns" 
     }, function() { 
     h1({ 
      "class": "docs header" 
     }, "Header"); 
     return hr(); 
     }); 
    }); 
    this.content; 
    return this.getBlock('scripts').toHTML(); 
    }); 
}); 

Обратите внимание, как this.content просто для возбуждения иска заявление. Как будто я сделал это: "a"; "b"; "c"; "d" ничего не сделало бы ничего.

Использование или намерение кода, который вы использовали, по-видимому, подразумевает непонимание того, как работает CoffeeKup или CoffeeScript, поэтому позвольте мне оценить, что происходит и почему иногда это работает, а иногда и нет.

Когда мы делаем div -> "blah", он перемещается до div(function(){return "blah";}), который говорит, что передал div функцию, которая при вызове возвращает строку blah. Теперь CoffeeKup знает, что любые строки, возвращенные ему, должны отображать для удобства. Но поскольку мы не можем вернуть несколько вещей (поскольку первый возврат существует в блоке), что нам делать?

CoffeeKup обеспечивает функцию text, что позволяет нам сделать:

div -> 
    text "a" 
    text "b" 

Что при компиляции выглядит следующим образом:

div(function() { 
    text("a"); 
    return text("b"); 
}); 

Какие именно то, что мы хотим, как text вызов, так же, как div и все остальные вызовы элементов, не возвращает строку и выводит содержимое напрямую.

Так что в целом, решение префикс:

@content 
@getBlock('scripts').toHTML() 

С text вызова, поэтому он становится:

text @content 
text @getBlock('scripts').toHTML() 

Если вы когда-либо хотите, чтобы избежать HTML сущности (так преобразования < до &lt;), то вы захотите добавить h звонок так же, как и так h "content to be escaped" и в сочетании с text будет выглядеть как text h "content to be escaped" - однако это только что-то заметьте, не то, что вам нужно прямо сейчас или здесь.

+0

Да, большое спасибо за быстрый ответ. – 8ken

+0

Sweet! Если он решил проблему, обязательно отметьте ответ в качестве принятого ответа, щелкнув галочку рядом с ним, чтобы люди знали, что проблема решена. Больше информации здесь: http://meta.stackexchange.com/a/5235/149978 – balupton

+0

Сделано, еще раз спасибо, любя Docpad. – 8ken

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

  • Нет связанных вопросов^_^