Closed asika32764 closed 9 years ago
ScriptManager
ModuleManager
ScriptManager::setLegacy(true)
ScriptManager::addModule('calendar', function (Module $module, AssetHelper $asset, $selector = '.calendar', $format = 'Y-m-d') { if (!$module->inited()) { $asset->addJs('calendar.js'); } if (!$module->stateInited()) { $asset->internalJS(';jQuery(' . $selector . ').calendar({format: "' . $format . '""})'); } }); ScriptManager::calendar('.my-input', 'Y-m-d H:i:s');
$module->inited() 以 module name 作為判斷,所以 calendar.js 永遠只會載入一次。
$module->inited()
calendar.js
$module->stateInited() 以 module name + custom arguments 作為判斷,所以相同的 arguments 只會載入一次,更換 arguments 後就可以重新加一段 internal JS
$module->stateInited()
如果只希望用 $selector 當作 $module->stateInited() 的判斷 id,忽略 $format,可以這樣寫
$selector
$format
function(Module $module, AssetHelper $asset, $selector = '.calendar', $format = 'Y-m-d') { // ... $module->setStateId($module->createStateId($selector)); if (!$module->stateInited()) { $asset->internalJS(';jQuery(' . $selector . ').calendar({format: "' . $format . '""})'); } } ScriptManager::calendar('.my-input', 'Y-m-d H:i:s');
用 setStateId() 可以決定 state id 的組成規則
setStateId()
@LeoOnTheEarth plz review this
除了幾個小細節外,沒什麼問題了
Complete
:+1:
ScriptManager
改成 Proxy,新增ModuleManager
取代 ScriptManager 的工作,但平時還是使用 ScriptManager,原則上大多數向下相容。ScriptManager::setLegacy(true)
即可回復原本的模式以下是簡易範例
$module->inited()
以 module name 作為判斷,所以calendar.js
永遠只會載入一次。$module->stateInited()
以 module name + custom arguments 作為判斷,所以相同的 arguments 只會載入一次,更換 arguments 後就可以重新加一段 internal JS自訂快取規則
如果只希望用
$selector
當作$module->stateInited()
的判斷 id,忽略$format
,可以這樣寫用
setStateId()
可以決定 state id 的組成規則