【问题标题】:Create html from json fetched with ajax从 ajax 获取的 json 创建 html
【发布时间】:2013-04-02 08:27:47
【问题描述】:

我想做的事:

我有一个基于 symfony2 (php) 的应用程序。一个简单的操作会像这样以 json 格式返回数据

    $headers = array(
        'Content-Type' => 'application/json'
    );

    return new Response($data, 200, $headers);

这个动作是像这样从javascript调用的

function loadData(action){
    $.ajax({
        type: "POST",
        url: action,
        success: function(data){
            console.log(data);
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            alert(errorThrown);
        }
    });
}

所以到目前为止,这似乎非常基本。从控制台我可以看到返回的正确数据。这些数据应该放在项目网站的某个地方。

问题:

是否有任何直接的方法可以在 javascript 中从 json 创建 html?实际上我想从项目的逻辑中分离模板(树枝)。那么生成html是否正确,例如在loadData方法的成功回调中?

我可以通过返回 html 而不是 json 来绕过这个问题。但我考虑为我的项目构建某种 rest api,我认为需要 json 进行传输。

有什么建议或想法吗?请分享您的处理方式。

【问题讨论】:

  • 当然可以,但是你的 json 在哪里。我的意思是你的 json 响应样本
  • 只是一个注释,但对于 JSON 响应,您可以使用 Symfony\Component\HttpFoundation\JsonResponse->create() 而无需发送您自己的标头或状态信息。
  • “我可以通过返回 html 而不是 json 来绕过这个问题。但我考虑为我的项目构建某种我认为需要 json 进行传输的 rest api。”你能详细解释一下吗?
  • 你可以像 Facebook 那样做,然后使用 $view = $this->renderView('Blah:Blah:some_content.html.twig, $vars) 返回预生成的 HTML,然后使用 return new JsonResponse(array('view' => $view)),最后使用 jQuery 填充所需的空间,使用 return (data) {$('#blah').html(data.view);},但它并不太便携。跨度>
  • @Jai json 响应是一组序列化的对象

标签: php jquery ajax json symfony


【解决方案1】:

您可以使用angular jssymfony 有一件好事:

angular.module('myApp', []).config(function($interpolateProvider){
        $interpolateProvider.startSymbol('[[').endSymbol(']]');
    };
);

它将{{ 更改为[[ 并让您在TWIG 中使用模板。

This 将有助于 Angular js 中的 json 查询

【讨论】:

  • 好东西。试试看吧
【解决方案2】:

获取数据并将其发送回服务器?我认为它不正确。

尝试查看underscore.js ( _.template() ) 以在客户端使用接收到的 json 对象进行模板化。

并尝试像这样使用 TWIG:

_.templateSettings = {
  interpolate : /\[\[(.+?)\]\]/g
};

var template = _.template("Hello [[ name ]]!");
template({name : "Mustache"});
=> "Hello Mustache!"

【讨论】:

    【解决方案3】:

    看看Handlebars

    您基本上可以将 JSON 传递给 Handlebars 模板:

    模板:

    <script id="entry-template" type="text/x-handlebars-template">
        <div class="entry">
            <h1>{{title}}</h1>
            <div class="body">
                {{body}}
            </div>
        </div>
    </script>
    

    JS:

    var source   = $("#entry-template").html(),
        template = Handlebars.compile(source),
        context = {title: "My New Post", body: "This is my first post!"},
        html    = template(context);
    

    结果:

    <div class="entry">
        <h1>My New Post</h1>
        <div class="body">
            This is my first post!
        </div>
    </div>
    

    【讨论】:

    • twig 中使用了相同的语法{{,所以在模板中使用它会有问题。例如,有什么方法可以将{{ 更改为[[
    • 在这种情况下,您将无法在 twig 中使用例如系统变量。
    • 您可以随时结束逐字标记。
    猜你喜欢
    • 2014-06-25
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    • 2016-05-14
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    • 2012-02-25
    相关资源
    最近更新 更多