在SPA中,我有一个视图,其中我使用compose绑定包含另一个视图。此子视图(子视图)具有一个在加载父视图时调用的activate方法。
if (isset($_POST['g-recaptcha-response'])) {
$captcha = $_POST['g-recaptcha-response'];
$privatekey = "SECRET_KEY";
$url = 'https://www.google.com/recaptcha/api/siteverify';
$data = array(
'secret' => $privatekey,
'response' => $captcha,
'remoteip' => $_SERVER['REMOTE_ADDR']
);
$curlConfig = array(
CURLOPT_URL => $url,
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => $data
);
$ch = curl_init();
curl_setopt_array($ch, $curlConfig);
$response = curl_exec($ch);
curl_close($ch);
}
$jsonResponse = json_decode($response);
if ($jsonResponse->success == "true")
doSomething();
else
doSomeOtherThing();
但是,当我离开父视图然后返回它(不刷新浏览器)时,不再调用子视图中的activate方法。如何在每次加载父视图时强制调用它?
答案 0 :(得分:2)
由于您未在此处利用路由器,因此子视图模型的行为将不会遵循完整的激活生命周期。您可以采取两种方法:(a)利用路由器或(b)手动激活孩子。
如果您想采用第一种方法,则应在viewModel上创建子路由器并创建router
绑定而不是compose
绑定。在这种情况下这可能有点过头了所以我会跳过它。
根据您在此处提供的信息,更好的方法是不要尝试自动挂钩激活生命周期。因此,不要激活您的activate()
功能,而是将其称为init()
:
function folIndexViewModel() {
this.init = function() {
...
};
}
在您的父母中,让您的激活函数调用init
var child = require('viewmodel/fol/index');
function parentViewModel() {
this.activate = function() {
child.init();
}
}
请注意,此方法仅适用于您的孩子是单身人士的情况。有关详细信息,请参阅本文底部:http://durandaljs.com/documentation/Creating-A-Module.html。