0

我正在开发一个必须与 Web 服务通信的网站。我正在使用这样的 Ajax 调用,例如,如果我想调用一个名为 getCustomer(...) 的方法,我在 Zend 项目中有一个名为“customer”的模块。

在我的控制器内部,我有一个名为“jsonAction”的动作

public function jsonAction() {
        $this->_helper->viewRenderer->setNoRender();
        $server = new Zend_Json_Server();
        $server->setClass('Customer_Model_Customer');
        $server->handle();
        exit;
    }

它们在我的模型中具有以下功能:

/**
 * Get Customer
 * @param string $customerNr
 * @return object
 */
public function getCustomer($customerNr){
    /*....*/
}

所以我想使用 Ajax 调用来调用这个函数。我所做的是这样的:

getCustomer : function(customerNr){
        if(customerNr == null)
            return;
        var request                 = {};
        request.method              = "getCustomer";
        request.params              = {};
        request.params.customerNr   = customerNr;
        request.id                  = Math.floor(Math.random()*101);
        postObject(webServicesURL, JSON.stringify(request), successGetCustomer);
    },

其中 postObject 是 Ajax 函数:

function postObject(url, request, successCallback){    
    try{
        $.ajax({
            type: "POST",
            dataType: 'json',
            url: url,
            contentType: "application/x-www-form-urlencoded",
            data: request,
            xhrFields: {
                withCredentials: true
            },
            success: function(data){
                successCallback(data);
            },
            error:  function (data) {
                /*Notify error*/
            }
        });
    } catch(ex){
        /*erro*/
    }
}

我的问题是,还有另一种方法可以做到这一点吗?最好和优雅的方式?我是网络开发的新手,这就是为什么我要寻求您的帮助。

注意:我使用的是 php Zend 框架 1.12、Ember 1.0 和 JQuery 1.8

4

3 回答 3

1

更好的方法可能是不调用单个动作,而是调用不同的动作,让contextswitch公开各种数据类型,您可以找到代码片段here

这是一种方法

//put this in your bootstrap
  protected function _initContextSwitch()
  {
    // Initialize contextSwitch helper
    Zend_Controller_Action_HelperBroker::addHelper(new Custom_Action_Helper_ContextSwitch());
  }

class Custom_Action_Helper_ContextSwitch extends
  Zend_Controller_Action_Helper_ContextSwitch
{
  public function preDispatch()
  {
      $actionName = $this->getActionController()->getRequest()->getActionName();
      $this
        ->addActionContext($actionName, 'json')
        ->initContext();
  }
}

现在扩展 Zend_Controller_Action_Helper_ContextSwitch 以使所有操作都暴露 json 数据

现在使用这样的查询字符串( format=json)调用每个方法,http://example.com/module/controller/action?format=json并将为每个操作公开 json 数据

NB请记住,这是一个自定义操作助手,其命名空间是自定义

于 2013-09-07T10:32:11.727 回答
0

如果您使用的是 Ember.js,那么您可能应该使用 Ember 的数据持久性组件 ember-data。

我建议您阅读emberjs.com指南。使用 Ember.js 不能掉以轻心,需要遵守约定和标准。您需要重新考虑当前的方法。

ember-data 实现了一个客户端 RESTFUL API 接口。就像在服务器上一样,您应该在客户端上指定模型。Ember.js 是一个框架,而不是一个库。用它!

于 2013-09-07T10:20:14.370 回答
0

您还可以检查请求是否是这样的 ajax(在您的控制器中):

$this->_request->isXmlHttpRequest()

有了它,您可以调用任何操作,执行所需的操作,然后根据您从请求检查中获得的值,您可以让视图呈现,或者在 AJAX 调用的情况下打印出一个 json 字符串

public function dosomethingAction(){
    // do something ...
    $this->view->data = $data = array(
        'param1' => 'v1'
        'param2' => 'v2'
    );

    if($this->_request->isXmlHttpRequest()){
        $this->getHelper('json')->sendJson($data);
    }
}
于 2013-09-09T09:21:10.813 回答