0

我发布这个问题是因为我不知道还能做什么。我在 Zend 中看到过类似的问题,但已被接受的答案根本不适合我。

环境:Zend Framework 1.12 Jquery:1.10.3 用于 jquery-ui.css、jquery-1.9.1.js 和 1.10.3 jquery-ui.js

当我使用 jquery api 文档的默认功能示例时,一切都很顺利,效果很好。当我将连接到控制器的“自动完成”操作的 url 作为源时,问题就出现了。我的控制器做得很好,ir 以 json 格式响应,但问题是,它响应如下:

{"json":[{"label":"John-1","value":"John"},{"label":"Jay","value":"Jay-1"},{"label":"Lusi","value":"Lusi-1"}]}

所以你看,它把所有的东西都放在一个 1 的数组中,键为 'json',这很让人抓狂,因为 Jquery 不明白,jquery 只想要/需要/查找包含数据的数组。所以我明白为什么它不起作用,但我不知道如何解决它(我是 php、zend 和 javascript 的新手)。

为了让控制器停止渲染视图脚本和布局并将传递给视图的信息作为 json 发送,我在 init() 方法中使用了 switchContext 帮助器:

 public function init() {
        $contextSwitch = $this->_helper->getHelper('contextSwitch');
        $contextSwitch->addActionContext('autocomplete', 'json')
                ->initContext();
    }

这是自动完成操作:

public function autocompleteAction()
    {
        $autocomplete_data=array(
            array('label'=>'John-1', 'value'=>'John'),
            array('label'=>'Jay', 'value'=>'Jay-1'),
            array('label'=>'Lusi', 'value'=>'Lusi-1')
        );
       //echo Zend_Json::encode($autocomplete_data);
       $this->view->json= $autocomplete_data;
    }

如您所见,将“json”作为我发送的所有自动完成信息的数据的键的原因是传递给视图的变量的名称。(我通过将变量名从 json 更改为“lala”来测试它,当我通过 url 访问时,数组的键现在是“lala”,如 {"lala":[{"label":"John-1","价值":"约翰"}....

你可以看到我也尝试使用 json_encode() (这是 Zend_Json::encode() 使用的),并回显它,这就是发送的内容:

[][{"label":"John-1","value":"John"},{"label":"Jay","value":"Jay-1"},{"label":"Lusi","value":"Lusi-1"}]

我什至不知道如何使用它访问数据。

有谁知道如何像这样简单地发送数组 [{"label":"something", "value":"something"}...] ?

或者有谁知道我可以如何操纵来自“来源:”的响应,以便它读取我的控制器响应的任何内容--> response['json']¿?

编辑

好吧,我相信我在做某事。jquery 的 api 文档有这个例子,我相信它正在做我想做的事:从源头操作响应。所以我试图用以下方法模仿它:

$( "#profesor" ).autocomplete({
        source:function(response ) {
            $.ajax({
                url: url,
                dataType: "json",
                success: function( data ) {
                    console.log(data);
                    response(data['json']);
                }
            });
        },
        minLength:1
    });

当它到达 console.log(data) 时,'data' 是我的控制器发送的响应(数组中带有 'json' 键的响应)。太好了,所以我应该做的就是将自动完成的响应设置为数据 ['json'],但是一旦到达该行......就会出现以下异常:“未捕获类型错误:对象不是函数” . 这意味着什么?它无法访问自动完成的“响应”功能?

完成编辑 提前谢谢!

4

1 回答 1

0

由于我在“源代码”中粗心地编写函数,引发了异常。jquery api文档有这个函数包含两个参数,第一个是输入到自动完成输入元素中的值(我的例子,它是带有id“profesor”的文本类型),第二个是响应函数。如果您在“已编辑”部分查看我的代码,您会注意到我只有一个参数,当我尝试将其作为函数调用时,异常(绝对正确)Uncaught type Error: object is not a函数跳出。所以这是正确的方法:

 $( "#profesor" ).autocomplete({
            source: function( request, response ) {
                $.ajax({
                    url: url+'/term/'+request.term,
                    dataType: "json",
                    success: function( data ) {
                        response(data['json']);
                    }
                });
            }
        });

我所做的是将“/term/typedTerm”附加到 url 中,以便我的控制器可以处理并在数据库中查找以它开头的任何内容。jquery 将收到的响应是它想要的:

[{"label":"YourLabel","value":"LabelValue"},{"label":"Yourlabel2","value":"YourValue2"}]

再一次,我不得不经历这个过程,因为我的控制器发送了包装在 {"viewVariableName":[actualData]} 中的 json 数据,而我需要的是:[actualData]。我注意到这不会发生在那些不使用 contextSwitch _helper 的人身上,而是在每个应该发送 json 数据的操作上手动禁用布局和渲染。

 $this->_helper->viewRenderer->setNoRender(true);
 $this->_helper->layout->disableLayout();
 ....logical stuff here...
 echo Zend_Json::encode($DataToSend);

为什么我留在我的身边?因为我宁愿只指定将在一个地方使用 contextSwitch 发送 json 数据的控制器(因为该控制器中的一些操作将发送 json 数据)而不是记住(并留下)两行代码在每个动作上。我想是“喜欢”的问题。

于 2013-06-03T13:21:33.273 回答