2013-03-25 35 views
2

我打電話,生成一個按鈕一個Ajax功能:YII:Renderpartial不生成JavaScript?

$html = $this->renderPartial('/cart/_cartItem', array('data' => $data, ) , true); 

問題是,如果我打印出$ HTML,我看到按鈕,但相關的JavaScript來使按鈕正常工作,不存在。有沒有辦法強制渲染,以包括必要的JavaScript,使這個按鈕的工作100%?

回答

1

的document.ready我固定它做兩件事情:

首先,包括所有的JavaScript的過程$ outputTrigger設置真正;

$html = $this->renderPartial('/cart/_cartItem', array('data' => $data, ) , true, **true**); 

其次,新增這也:

<link rel="stylesheet" type="text/css" href="/easionline2/www/assets/9bdc3248/css/bootstrap-yii.css" /> 
<script type="text/javascript" src="/easionline2/www/assets/1dffa579/jquery.js"></script> 
<script type="text/javascript" src="/easionline2/www/assets/9bdc3248/js/bootstrap.js"></script> 

我做了一個黑客擺脫這樣的:

$start = strpos($html, '<div class="cartItem'); 
$end = strlen($html) - $start; 
$html = substr($html, $start , $end); 

任何人都知道一個更好的方式做第二部分?

+1

在你的局部視圖可以設置的jquery.js和bootstrap.js假的'scriptMap'值,見【答案】(http://stackoverflow.com/a/14476473/720508) – 2013-03-25 14:27:10

+2

Yous不應該引用這樣的資產文件... – soju 2013-03-25 14:41:44

1

將JavaScript放在包含按鈕的頁面上(不要使用...),但對於ex;

Yii::app()->clientScript->registerScript('toggle', " 

$('#clearDate').click(function() { 
$('#Project_start_date').val(''); 
}); 

"); 

如果仍然劑量不會工作的嘗試,包括在JavaScript

0

這個問題已經得到解答,但這是相關的,可能會派上用場。

請注意在Yii中通過AJAX調用renerPartial()。這是一個已知的錯誤,Yii沒有正確說明AJAX引入的新視圖之外的javascript。如果您正在加載一個小部件,或者重新加載jQuery或另一個JS文件的東西,那麼在AJAX調用之前最初加載到頁面上的jQuery將被遺忘,並且它所做的所有代表也會被遺忘。這個JS代碼設置了所有的AJAX調用來去除任何JS腳本的新HTML,該JS腳本將加載已經加載的JS文件。把它放進你的主觀點:

<script> 
$.ajaxSetup({ 
global: true, 
dataFilter: function(data,type){ 
    // only 'text' and 'html' dataType should be filtered 
    if (type && type != "html" && type != "text") 
    { 
       return data; 
    } 

    var selector = 'script[src]'; // copy-paste the following back in after [src] if you also want stylesheets blocked too: ,link[rel="stylesheet"] 

     // get loaded scripts from DOM the first time we execute. 
     if (!$._loadedScripts) { 
     $._loadedScripts = {}; 
     $._dataHolder = $(document.createElement('div')); 

       var loadedScripts = $(document).find(selector); 

     //fetching scripts from the DOM 
      for (var i = 0, len = loadedScripts.length; i < len; i++) 
     { 
        $._loadedScripts[loadedScripts[i].src] = 1; 
       } 
     } 

    //$._dataHolder.html(data) does not work 
    $._dataHolder[0].innerHTML = data; 

    // iterate over new scripts and remove if source is already in DOM: 
    var incomingScripts = $($._dataHolder).find(selector); 
    for (var i = 0, len = incomingScripts.length; i < len; i++) 
    { 
     if ($._loadedScripts[incomingScripts[i].src]) 
     { 
        $(incomingScripts[i]).remove(); 
       } 
       else 
       { 
        $._loadedScripts[incomingScripts[i].src] = 1; 
       } 
     } 

    return $._dataHolder[0].innerHTML; 
} 
}); 
</script>