我正在构建一个codeigniter / php Web应用程序。 我试图在加载视图时将JSON对象从控制器传递到视图,其方式是javascript可以访问它。
JSON如下所示:
{
"event": {
"id": "1",
"name": "Some name",
"description": "Some description",
"address": "1 Main st."
},
"members": {
"others": [
{
"id": "26",
"name": "Brad Black"
},
{
"id": "27",
"name": "Bill Blue"
}
],
"current": {
"id": "1",
"name": "Jill White"
}
}
}
控制器代码如下所示:
public function index()
{
$some_data = $this->Some_model->get_some_data();
$some_data = json_encode($some_data);
$data = array (
'some_data' => $some_data
);
$this->load->view('some_view',$data);
}
view(some_view)代码如下所示:
<script src="path/to/scripts/some_script.js" type="text/javascript"></script>
<script type="text/javascript">
some_data = "<?php echo $some_data?>";
</script>
<div class="main">
</div>
javascript(some_script)代码如下所示:
var some_data;
$(document).ready(function(){
some_data = $.parseJSON(some_data);
});
挑战在于,由于JSON对象是作为字符串发送的(在json_encode之后),因此它具有{和引号作为其一部分的字符,当我将其分配给var时,javascript不喜欢它(some_data =&#34;&#34 ;;)。我也尝试过使用它但效果也不好。
我尝试做了一堆不起作用的东西,为了取得进展,我暂时最终取代了&#34;在控制器中 $ data [&#39; some_data&#39;] = str_replace(&#39;&#34;&#39;,&#34;&#34;&#34;,$ some_data);
public function index()
{
$some_data = $this->Some_model->get_some_data();
$some_data = json_encode($some_data);
$data = array (
'some_data' => str_replace('"', """, $some_data);
);
$this->load->view('some_view',$data);
}
并替换&#34;回到&#34;在javascript里面 some_data = some_data.replace(/&#34; / g,&#39;&#34;&#39;);
var some_data;
$(document).ready(function(){
event_data = event_data.replace(/"/g, '"');
some_data = $.parseJSON(some_data);
});
这有点难看,我正在寻找更好的解决方案。
任何指针都将非常感激。
更新! 问题解决了,看起来像额外的报价打破了事情。
该解决方案符合mohan.gade的回答:
控制器:
public function index()
{
$some_data = $this->Some_model->get_some_data();
$some_data = json_encode($some_data);
$data = array (
'some_data' => $some_data;
);
$this->load->view('some_view',$data);
}
查看:
some_data = <?php echo $some_data?>;
</script>
答案 0 :(得分:2)
您的JSON值未传递给视图,请尝试更正以下代码。
public function index()
{
$some_data = $this->Some_model->get_some_data();
$some_data = json_encode($some_data);
$data = array (
'some_data' => $some_data
);
$this->load->view('some_view',$data);
}
//in view file
<script type="text/javascript">
var jsonData = <?php echo $some_data; ?>
</script>
答案 1 :(得分:2)
如果您在模型中有一定的理智,这可以在没有大量代码的情况下安全地完成。您发布的JSON让我相信您有一个包含事件的数据库,并且事件存在或不存在。
如果$this->Some_model->get_some_data()
返回可以使用相等运算符验证的类型FALSE
或NULL
,如果不存在结果,则可以在视图中安全地将此表达给您的JS你可以传达JSON的方式。
E.g:
$some_data = $this->Some_model->get_some_data();
if ($some_data === NULL) {
$data['somedata'] = 'null';
} else {
// We trust our model, pass it along.
$data['somedata'] = json_encode($some_data);
}
$this->load->view('some_view', $data);
然后,在您的JS中,只需验证包含原始JSON字符串的变量在操作之前实际上不是null。您也可以将其设置为整数,重点是可以轻松区分。
从它的外观来看,如果事件确实存在,你至少会拥有事件数据和创建它的人作为成员。您可能需要进行更多的健全性检查,我不确定您的模型中有什么。
确保PHP变量在JS中以语法正确的方式扩展,或者如果没有数据存在则可以选择完全改变JS。
答案 2 :(得分:0)
json_encode将返回null
,因此您无需在查看代码中转义"
它。相反,你必须检查变量是数组还是要传入的对象以生成不同的代码。
对于你的例子:
if( is_array( $_var_value ) || is_object( $_var_value) ){
echo 'var ' . $_var_name . ' = ' . json_encode( $_var_value ) . ";";
}else{ // if( is_string( $_var_value ) ){
echo 'var ' . $_var_name . ' = "' . $_var_value . '";';
}
为您更新案例
<script type="text/javascript">
<?php if( is_array( $_var_value ) || is_object( $_var_value) ){ ?>
var some_data = <?php echo json_encode($some_data); ?>;
<?php }else{ ?>
var some_data = "<?php echo $some_data; ?>";
<?php } ?>
</script>