【问题标题】:Codeigniter - how to pass JSON as a parameter to the view [duplicate]Codeigniter - 如何将 JSON 作为参数传递给视图 [重复]
【发布时间】:2012-11-22 19:41:09
【问题描述】:

我正在构建一个 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);
}

视图 (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 (some_data = "";)。我也尝试过使用,但效果不佳。

我尝试做了一堆不起作用的事情,为了取得进展,我暂时最终更换了控制器中的“ $data['some_data'] = str_replace('"', """, $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('"', "&quot;", $some_data);
    );

    $this->load->view('some_view',$data);
}

并替换 javascript 中的“返回到” some_data = some_data.replace(/"/g, '"');

var some_data;

$(document).ready(function(){

    event_data = event_data.replace(/&quot;/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>

【问题讨论】:

    标签: php javascript json codeigniter view


    【解决方案1】:

    您的 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>
    

    【讨论】:

    • 谢谢莫汉,我实际上是按照你建议的顺序做的,当我写问题时,我以错误的顺序剪切和粘贴行。 JSON创建正确,我的问题是如何将它分配给客户端(视图/javascript)的javascript var。我已经更新了问题以反映它。
    • 您的代码运行良好!看起来我(出于某种原因)在 标签周围有一个额外的引号......将您的答案标记为正确的
    【解决方案2】:

    只要您的模型有一定的理智,这无需大量代码即可安全地完成。你发布的 JSON 让我相信你有一个包含事件的数据库,而一个事件要么存在,要么不存在。

    如果$this-&gt;Some_model-&gt;get_some_data() 返回一个类型化的FALSENULL,如果不存在结果,则可以使用相等运算符进行验证,您可以安全地将其表达到视图中的 JS,就像您可以传达JSON。

    例如:

    $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 字符串的变量在对其进行操作之前实际上不为空。也可以只设置为整数,重点是便于区分。

    从外观上看,如果事件确实存在,您至少将拥有事件数据和创建它的人作为成员。您可能需要做更多的健全性检查,我不确定您的模型中有什么。

    只需确保 PHP 变量在您的 JS 中以语法正确的方式展开,或者如果没有数据可以选择完全更改 JS。

    【讨论】:

    • 谢谢蒂姆,我确实在处理事件。 JSON 永远不会像您所怀疑的那样为 NULL 或空。 JSON 在控制器端没问题。我的挑战是如何将它分配给客户端(视图/javascript)的 javascript var,因为它具有 { 或引号之类的字符(我遇到未捕获的异常)。我已经更新了问题以反映它。
    • @user898836 var my_json = &lt;?php echo $data['somedata'];?&gt;; some_data = $.parseJSON(my_json); 不工作?
    • 它稍作修改, 必须是 我不需要使用 parseJSON .再次感谢!
    【解决方案3】:

    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>
    

    【讨论】:

    • 感谢 Cauliture。您是否建议我应该在 中使用您的代码,而不是我的
    • 不,它在视图文件中可能很难看,但我认为它易于阅读和维护,并且在 javascript 上也很好处理。
    • isIterable 条件不是必需的。 stackoverflow.com/a/57439636/2943403
    猜你喜欢
    • 2019-12-19
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    • 2013-11-11
    相关资源
    最近更新 更多