【问题标题】:jquery autocomplete over ajax fails under CakePHP3.x在 CakePHP3.x 下,通过 ajax 的 jquery 自动完成失败
【发布时间】:2016-10-30 08:06:35
【问题描述】:

我有一个带有以下 jQuery sn-p 的页面:

$( "#fuser" ).autocomplete({
    source: "/users/jsonusers",

select: function(event, ui) {
    $("#find").val(ui.item.value);
    return false;
 },
 focus: function(event, ui) {
    $("#find").val(ui.item.label);
    return false;
 }

“源网址”处的代码如下所示:

    $connection = ConnectionManager::get('default');
    $results = $connection->execute($query, ['str' => $find])->fetchAll('assoc');

    $users = [];
    foreach($results as $user){
        $users[] = ['value'=>$user['user_id'], 'label'=>$user['full_name']];
    }

    $this->set(compact('users'));           
//  $this->set('_serialize', 'users'); // this is the correction that works
    $this->set('_serialize', ['users']); // this is Bake's default

当我尝试使用自动完成小部件时,它完全失败了。

查看我的控制台,我想我知道为什么。看起来 Cake 将我的“键”(“名称”和“值”)放在引号中,所以 json 看起来像这样:

[
        {
            "value": "46",
            "label": "Test User"
        }
]

而不是这样:

[
    {
        value:"46",
        label:"Test User"
    }
]

所以我想,“只需自己手动构建该死的对象。轻松遍历数组并根据需要格式化 json,不是吗?”

但是不,我错了。 CakePHP 根本不允许我规定如何通过 ajax 传输数据。我坚持使用 Cake 的格式。如果我尝试制作自己的 json 对象,它会因编码而受到破坏,并且无论如何仍会被埋葬为子对象。

我做错了什么?或者这只是 Cake 的一个错误?如果是这样,是否有一些解决方法?我可以让 jQuery 自动完成功能来处理 Cake 返回的 json 对象吗?我需要在js中进一步解析吗?遗憾的是,如果是这样,那超出了我使用 jQuery 的知识范围。

非常感谢任何帮助。

【问题讨论】:

    标签: jquery autocomplete cakephp-3.0


    【解决方案1】:

    如果你真的需要这样的数组:

    [
      {
        value:"46",
        label:"Test User"
      }
    ]
    

    那么你可以简单地做:

    $this->set('_serialize', 'users');
    

    代替:

    $this->set('_serialize', ['users']);
    

    意味着只是序列化字符串而不是数组。

    【讨论】:

    • 那是一个不幸的错字,我很感激你抓住它并提供帮助,但这不是我问题的根源。我更正了我的代码并发布。生成的 JSON 仍然没有被 jQuery 解析,因为如果我手动创建它并将其作为 JS var 嵌入到页面上(我不能这样做,因为我需要服务器上的动态全文查询,它是大量数据)
    • 如果让你的源像这样 /users/jsonusers.json 怎么办??
    • 如果您在包含“.json”的 url 中点击您的源代码,您将获得与您要查找的完全相同的数组。
    • 只是为了跟进。正如我所说,在纠正错字之后(我已经意识到这是由 Cake 自己的 Bake 引擎生成的,并且不是错字,而是不方便/未记录的“功能”),问题仍然存在。但后来它“神奇地”消失了。当代码更改没有反映在实时测试中时,回顾早期的调试尝试遇到了挫折,我得出的结论是,即使将调试模式设置为 false,也存在某种形式的 ajax 请求缓存。我不知道是什么或如何。但是没有其他任何东西可以解释为什么在使 Manohar 建议的编辑只在以后工作之后失败。
    • 所以 Manohar 删除 [braces] 的建议确实修复了该行为(尽管 JSON 仍然有引用的键,但无论如何它都有效)。 — 或者,我在 CakePHP 自己的讨论网站上得到的另一个建议(也有效)是在控制器中简单地使用 die($json) 来根据需要输出原始文本。
    猜你喜欢
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    • 2011-04-10
    • 2013-06-02
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    相关资源
    最近更新 更多