2014-01-17 63 views
0

我正在编写一个Yii应用程序(或者我应该说建立在别人的Yii应用程序之上!)。我需要使用相当多的JavaScript,因为我使用的是Leaflet地图库。所以很多这是外部的PHP代码和registerScriptFileregisterScript将变量从javascript传递给yii通过ajax

要调用的数据从主要Yii应用程序的JavaScript,我一直在使用AJAX调用。

$.ajax({ 
    type: "POST", 
    url: "xxx/index.php/site/updateajax", 
    data: {recordID: feature.properties.id} 
}).success(function(result){ 
    $("#recordTable").replaceWith(result); 
}); 

public function actionUpdateAjax() 
{ 
    $data = $_POST['recordID']; 
    $this->renderPartial('/map/_legend_layers', array('data' => $data),false,false); 
} 
在php

。我发现我需要调用$("#element").replaceWith(result);,因为否则渲染会返回但不会呈现。

在这种情况下,这工作正常,因为我可以调用replaceWith,但我有一个唠叨的感觉,这不是正确的方式来做到这一点,也有另一个AJAX调用呈现整个页面,所以我不能真的取代了。

我的问题是如何强制这些AJAX调用返回的HTML来呈现页面,或者更可能我想,我怎样才能使用AJAX来更新变量,返回成功代码或什么的,然后让yii代码继续并做它的事情 - 我只使用AJAX作为变量传递机制。

谢谢

回答

1

这对我来说很正常。 。 。您正在使用renderPartial生成HTML,然后您在AJAX中使用回调函数通过replaceWith将该HTML放到您想要的位置。对于你提到你想要整个页面的第二个用例,这听起来像你想渲染页面,而不是render renderpart。 。 。

的一个变化我想提出的是,在实际jQuery.ajax()呼叫使用成功回调,而不是那将会在1.8至被deprectated的jqXHR.success()方法,即:

$.ajax({ 
    type: "POST", 
    url: "xxx/index.php/site/updateajax", 
    data: {recordID: feature.properties.id}, 
    success: function(result){ $("#recordTable").replaceWith(result); } 
}); 
+0

谢谢,根据你的回答添加了对我有用的答案 –

0

这工作对我来说,当我需要从一个AJAX调用替换与HTML整个页面:

$.ajax({ 
type: "POST", 
url: "xxx", 
success: function(result){ 
document.open(); 
document.write(result); 
document.close(); 
}); 

我迄今发现的是,它不更新URL唯一的问题...

+0

正如我在我的回答中提到的,如果你想重定向到一个全新的页面而不是动态更新页面,你可能需要改变呼叫在PHP中从'renderPartial()'到[render()](http://www.yiiframework.com/doc/api/1.1/CController#render-detail)。您将可以跳过javascript成功功能,因为Yii将重定向到新页面。你会希望'$ return'参数成为默认的false。 。 。 – ernie

+0

我可能在这里错过了一些东西,但这就是我正在做的事情,我可以看到在我的调试控制台的“网络”选项卡中呈现的响应,但不能在页面本身中显示。我似乎无法向Yii发出请求,Yii收回控制权。确切的命令是\t \t $这 - >呈现( '创建',阵列( \t \t \t '模式'=> $项目,假 \t \t)); –

+0

哦,我应该提到,在第二种情况下,您只需直接调用操作(可能在表单本身中),而不是使用ajax调用,因为您不想执行任何操作async – ernie