Durandal Compose:不总是调用激活方法

时间:2015-04-23 16:31:58

标签: binding single-page-application durandal activation

在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方法。如何在每次加载父视图时强制调用它?

1 个答案:

答案 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