Проблема с "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 объект, и это делает withs видимый в пределах"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 вместо одного:

  1. один для вашего не-шаблона JavaScript с "use strict" включено.
  2. второй с только ваш JST, это не "use strict".