Проблема с "use strict" и подчеркиванием.Яш
Я написал приложение, используя Yeoman и позвоночник.js. В верхней части каждого файла js я указал 'use strict';
и когда я запускаю свои задачи grunt, jshint не сталкивается с ошибками.
Я могу построить свое приложение с grunt без проблем, однако, когда я пытаюсь запустить уродливый js, я получаю следующую ошибку:
Uncaught SyntaxError: Strict mode code may not include a with statement
Я искал базу кода,и единственное, что использует оператор with, - это подчеркивание.
Я новичок в строгом режиме, поэтому я не уверен, как я могу решить эту проблему. Могу ли я не использовать строгий режим в любом месте, где я использую функцию underscorejs?
спасибо.
EDIT:
учитывая приведенные ниже примеры кода (сокращенные для краткости). Как я могу изменить его, чтобы решить эту проблему.
'use strict';
/*global, Backbone, JST*/
var MyView = Backbone.View.extend({
template: JST['app/scripts/templates/MyView.ejs'],
initialize: function()
{
this.render();
},
render : function()
{
this.$el.html(this.template(this.templateVariables()));
return this;
},
templateVariables: function()
{
return {var1 : 'Hello', var2 : 'World'};
}
});
в как myview.EJS по
<p><%= var1 %><%= var2 %>!</p> //<p>Hello World!</p>
EDIT 2:
использование @mu слишком короткий ответ ниже я обнаружил, что лучший способ решить вызовы _.шаблон, который давал мне горе, изменил мою задачу grunt-JST следующим образом:
jst: {
compile: {
options:
{
templateSettings:
{
variable: 'data'
}
},
files: {
'.tmp/scripts/templates.js': ['<%= yeoman.app %>/scripts/templates/*.ejs']
}
}
},
а затем измените каждый из моих шаблонов, чтобы использовать .
может не относиться к другим, но я столкнулся с этой проблемой, используя Yeoman с ворчанием и генератором позвоночника, поэтому я не могу быть единственным.
1 ответов
библиотеки Underscore _.template
использует with
внутренне, чтобы позволить такие вещи, как <%= pancakes %>
разрешение obj.pancakes
. Если ты ... --34-->посмотреть внутри _.template
, вы найдете это:
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
вот где наступление with
происходит от. Если вы используете предварительно скомпилированные шаблоны JST style, это source
это то, что вы в конечном итоге внутри вашего JST
объект, и это делает with
s видимый в пределах"use strict"
. Заметьте, что settings.variable
там? документация говорит:
по умолчанию шаблон помещает значения из ваших данных в локальную область через
with
заявление. Однако вы можете указать одно имя переменной с помощью переменная настройка. Это может значительно повысить скорость визуализации шаблона._.template("Using 'with': <%= data.answer %>", {answer: 'no'}, {variable: 'data'}); => "Using 'with': no"
таким образом, вы можете подавить with
С помощью variable
опция при компиляции шаблонов; конечно, это также означает, что вам придется переписать все <%= ... %>
части ваших шаблонов, чтобы соответствовать тому, что variable
опция должна сказать (это также должно ускорить ваши шаблоны, поэтому это может стоить того).
в вашем случае вы бы изменили шаблон на это:
<p><%= data.var1 %><%= data.var2 %>!</p> //<p>Hello World!</p>
и тогда вам нужно будет изменить _.template
вызов, который используется для компиляции шаблонов, чтобы выглядеть так:
var compiled_template = _.template(raw_template, null, { variable: 'data' });
вы не должны использовать data
конечно, вам просто нужно использовать одно и то же в обоих шаблонах и _.template
звонок.
я не знаю, как вы изменили бы, как ваши настройки вызовов _.template
но это не должно быть так сложно. Я полагаю, вы могли бы обезьян патч _.template
есть значение по умолчанию для variable
в крайнем случае.
вот простая демонстрация, которая должна проиллюстрировать, что происходит:http://jsfiddle.net/ambiguous/Az8QM/
альтернативно, если мы посмотрим, как "use strict"
в области, посмотрим, что:
строгий режим применяется к всего скрипта или отдельные функции.
таким образом, вы можете локализовать свою строгость чем-то вроде этого:
(function() {
"use strict";
// All your non-JST JavaScript goes here.
})();
// Append your JST out here.
вы также можете использовать два файла JavaScript вместо одного:
- один для вашего не-шаблона JavaScript с
"use strict"
включено. - второй с только ваш
JST
, это не"use strict"
.