我发这个问题是因为我不知道还能做什么。我在Zend也看到过类似的问题,但被接受的答案根本不适合我。
环境: Zend Framework 1.12 Jquery: 1.10.3用于jquery-ui.css、jquery-1.9.1.js和1.10.3 jquery-ui.js
当我使用jquery文档的默认功能示例时,一切都很顺利,它运行得很好。当我将连接到我的控制器的动作"automplete“的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();
}下面是autocompleteAction:
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”:[{“标签”:“John-1”,“value”:“John”}.
您可以看到,我也尝试使用json_encode() (这是Zend_Json::encode()所使用的),并对其进行回音,这就是发送的内容:
[][{"label":"John-1","value":"John"},{"label":"Jay","value":"Jay-1"},{"label":"Lusi","value":"Lusi-1"}]我甚至不知道如何用它来访问数据。
有人知道如何简单地发送数组{“标签”:“某事”,“值”:“某事”}.简单得不得了?
或者有人知道我如何从“source”操作响应:这样它就可以读取我的控制器作为->响应‘’json‘响应的任何内容?
编辑
好吧,我想我有发现了。jquery的api文档有这个例子,我相信它正在做我想做的事情:从源代码操作resposne。所以我试着用以下方法来模仿它:
$( "#profesor" ).autocomplete({
source:function(response ) {
$.ajax({
url: url,
dataType: "json",
success: function( data ) {
console.log(data);
response(data['json']);
}
});
},
minLength:1
});当它到达console.log(数据)时,'data‘是我的控制器发送的响应(数组中带有'json’键的响应)。太棒了,所以我要做的就是将自动完成的响应设置为数据‘’json‘,但是一旦到达数据’‘json’,下面的异常就会出现:"Uncaught type line...the : object不是一个函数“。那是什么意思?它不能访问自动完成的“响应”功能?
完成编辑,谢谢!
发布于 2013-06-03 13:21:33
由于我在"source“中不小心地编写了函数,所以抛出了异常。jquery文档中包含两个参数,第一个参数是输入到自动完成输入元素中的值(在我的例子中,它的文本类型为id "profesor"),第二个参数是响应函数。如果您查看我在“编辑”部分的代码,您会注意到我只有一个参数,当我试图将它作为一个函数调用时--异常(在其绝对右侧)-- Uncaught类型错误: object不是函数跳出。因此,以下是正确的方法:
$( "#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);我为什么要和我的孩子在一起?因为我只想指定将json数据与contextSwitch一起发送到一个位置的控制器(因为该控制器中的一些操作将发送json数据),而不是在每个操作上记住(并留下)两行代码。我想是“喜欢”的事。
https://stackoverflow.com/questions/16883259
复制相似问题