запутанная фляга, созданная на стороне сервера с помощью шаблона underscore.js engin [duplicate]

Согласно выходному сигналу компилятора, в обоих примерах сигнатуры методов различны (скомпилируйте код с опцией -Xlint:unchecked, чтобы подтвердить его):

getSupplier() in A (m2)
                                 1st snippet
getSupplier()    in B (m1)


getSuppliers(Collection strings) in A (m2)
                                                           2nd snippet
getSuppliers(Collection strings)    in B (m1)

Согласно JLS , сигнатура метода m1 является поднайбой подписи сигнатуры метода m2, если либо:

  • m2 имеет ту же подпись, что и m1 , или
  • подпись m1 такая же, как стирание подписи m2.
blockquote>

Первое утверждение выходит из игры - метод подписи разные. Но как насчет второго утверждения и стирания?

Valid Override

B.getSupplier() (m1) является подъявлением A.getSupplier() (m2), потому что:

  • подпись m1 такая же, как стирание сигнатуры m2
blockquote>

getSupplier() после стирания равно getSupplier().

Недопустимое переопределение

B.getSuppliers(...) (m1) не является поднаклейкой A.getSuppliers(...) (m2), потому что:

  • подпись m1 не совпадает с стиранием сигнатуры m2
blockquote>

Подпись m1:

getSuppliers(Collection strings);

Утечка сигнатуры m2 :

getSuppliers(Collection strings);

Изменение аргумента m1 от Collection до необработанного Collection устраняет ошибку, в этом случае m1 становится поднаклейкой m2.

Заключение

1-й фрагмент кода (действительный переопределение) : сигнатуры метода в родительском и дочернем классах отличаются изначально. Но после применения стирания к родительскому методу подписи становятся одинаковыми.

2-й фрагмент кода (недопустимое переопределение) : сигнатуры метода первоначально отличаются и остаются разными после применения стирать родительский метод.

3
задан davidism 22 March 2016 в 01:34
поделиться

2 ответа

Вы не можете оценить JavaScript в Jinja. Вы пытаетесь создать URL-адрес на стороне сервера, в то время как Jinja выполняет рендеринг, но вы ссылаетесь на переменную, которая доступна только в JavaScript, запущенном в клиентском браузере.

Создание URL-адреса клиента сторона является самым простым исправлением. (Я не знаю, как выглядит ваш маршрут, так что вот пример.)

$('#demo').load('/url/for/addshare2/' + variable1);

Однако это не очень полезно, потому что вы не можете использовать url_for, поэтому вам нужно hard-code url. Это хороший признак того, что вы хотите, чтобы конечная точка AJAX передавала параметры, а не конечную точку, которая содержит значения.

@app.route('/addshare2', methods=['POST'])
def addshare2():
    share = request.json['share']
    ...
    return jsonify(result=...)

Теперь вы можете сгенерировать URL с url_for и пройти параметры как данные формы.

$.post(
    '{{ url_for('addshare2') }}',
    {share: variable1},
    function (data) {
        // do something with data on successful response
    }
);
9
ответ дан davidism 23 August 2018 в 19:01
поделиться

Иногда я использую следующее обходное решение с временной строкой-заполнителем:

var variable1 = "someString";
$('#demo').load(
    "{{ url_for('addshare2', share='ADDSHARE2') }}".replace("ADDSHARE2", variable1)
);

Это не совсем правильно, и я все еще ищу лучшее решение. Но он выполняет эту работу.

1
ответ дан Falko 23 August 2018 в 19:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: