如何将一个流体变量从控制器传递给 jQuery 或 JavaScript?
在我的控制器内部:
public function tabs () {
$this->view->assign('tab', 1);
}
在流体内部,我将变量用作 {tab} 但如何传递给 JavaScript?任何帮助,将不胜感激...
如果您需要像 f:for 这样的流体标签,您可以使用 CDATA(也可以使用流体变量)。例如
<script type="text/javascript"><![CDATA[
function initialize() {
var marker = [];
var LatLng;
var queryLatlng = new google.maps.LatLng(]]>{queryLat}, {queryLng}<![CDATA[);
var mapOptions = {
center: queryLatlng,
zoom: 8,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById("tx_gmapplus-map"),mapOptions);
marker['0'] = new google.maps.Marker({
position: queryLatlng,
map: map,
title: "Standort"
});
]]><f:for each="{addresses}" as="address" iteration="it"><![CDATA[
latlng = new google.maps.LatLng(]]>{address.txGmapplusLatitude}, {address.txGmapplusLongitude}<![CDATA[);
]]>marker['{it.cycle}']<![CDATA[ = new google.maps.Marker({
position: latlng,
map: map,
title: ]]>"{address.name}"<![CDATA[
});
]]></f:for><![CDATA[
}
]]></script>
写起来不太舒服,但它正在工作,并且您具有流体逻辑的优势。
我通常为此使用数据属性。所以在流体中你有这样的东西:
<div data-tab="{tab}"></div>
在您的 JavaScript 中,您可以通过以下方式访问此属性:
jQuery('div').data('tab');
当然,您可以为此使用任何 HTML 元素。
流体模板中的 JS 行为是......在大多数情况下很糟糕,如果您的 JS 代码包含任何大括号,则您需要包含外部脚本,而不是将脚本放在视图中。
原因是 Fluid 认为,所有大括号都属于它的范围,所以当你写的时候:
$('#mySelectBox').change(function() {
// functions body code
// next line
// next line
});
Fluid 销毁 JS 并将其呈现为:
$('#mySelectBox').change(function() Array);
然后我经常使用这样的东西:
在视图中:
<script>var TxMyExtKeyTabNumber = {tab}</script>
<script src="path/to/static/script.js"></script>
在 script.js 中:
$("#container").val(TxMyExtKeyTabNumber);
我有没有 ![CDATA[. 我在将元素 ID 传递给流体模板中的模态时遇到问题
document.addEventListener("DOMContentLoaded", function(event) {
var deki = '#modal-{data.uid}'; // data.uid is fluid variable
$(deki).on('show.bs.modal', function () {
// call play() on the <video> DOM element
$('#videoId1')[0].play()
});
$(deki).on('hidden.bs.modal', function () {
// call play() on the <video> DOM element
$('#videoId1')[0].pause()
})
});
我做了这样的事情,对于值只需添加{settings.mySettingName}
TypoScript 变量或您拥有的任何数据
function getHiddenSettings(className) {
var settings = {};
$.each($(className), function (index, input) {
if (input.dataset.type === "integer") {
settings[input.name] = parseInt(input.value) || 0;
} else if (input.dataset.type === "boolean") {
settings[input.name] = !!(parseInt(input.value) || input.value === "true")
} else if (input.dataset.type === "string") {
settings[input.name] = input.value;
}
});
return settings;
}
var settings = getHiddenSettings(".mySettings");
$('pre').html(JSON.stringify(settings, null, 2));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="hidden" class="mySettings" name="closedTimes" value="0" data-type="integer">
<input type="hidden" class="mySettings" name="onlyEmail" value="false" data-type="boolean">
<input type="hidden" class="mySettings" name="serverError" value="Server problem" data-type="string">
<pre></pre>
不好(但也不比 CDATA 的东西更丑),但可以直接在 javaScript 中使用标记符号流。在 { } 括号之外,您当然可以直接访问流体变量。在括号内,您可以使用任何流体标签包装流体变量。
所以下面的所有例子都可以工作......
<script>
var myGlobal = {fluidVar};
function myFunc(){
var myLocal = <f:format.raw>{fluidVar2}</f:format.raw>
var myLocal2 = <f:if condition="1">{fluidVar3}</f:if>
}
</script>