我已经提出了一个解决方案。它不是很优雅,但它确实有效。
在我的视图底部:
echo $this->Html->scriptBlock(
'function sendAjaxRequest(){
$.ajax({
type: "POST",
url: "' . $this->Html->url(array('controller' => 'clients', 'action' => 'add_external')) . '",
data: "name="+$(\'#JobNewClientName\').val(),
success: function(msg){
//parse and sort the entries alphabetically
msg = $.parseJSON(msg);
var values = [];
for(var i in msg) {
values.push({ key: i, value: msg[i] });
}
values.sort(function(a, b) {return a.value.toLowerCase().localeCompare(b.value.toLowerCase())});
var str = values.map(function (kvp) { return kvp.value; }).join(\'\n\');
//remake the selectbox options
var options = \'<option value=""></option>\';
$.each(values, function(i){
options += \'<option value="\'+values[i].key+\'">\'+values[i].value+\'</option>\';
});
$(\'#JobClientId\').html(options);
}
});
}');
控制器:
function add_external() {
$this->autoRender = false;
$this->Client->create();
$this->Client->set('name', $_POST['name']);
$this->Client->save();
echo json_encode($this->Client->find('list', array('order' => array('Client.name' => 'ASC'))));
}
本质上,该add_external()
函数从 ajax 中获取一个发布的名称并将其添加到数据库中。然后json_encode
是所有客户。
然后这个 JSON 对象在 javascript 成功语句中被解析和排序,这个排序保留了控制器定义的顺序,即按字母顺序按值(不是键)。
接下来,我可以创建一个全新的options
变量,其中包含选择框所需的相同标记。然后我需要做的就是把它们关掉。
如果有人能想到一个更优雅的解决方案,我很乐意授予他们接受。