避免硬编码解决方案发布方法

时间:2011-07-21 07:29:29

标签: javascript jquery html

我有这个帖子方法

$.post("/abc/export.action",
              { 
                sessiontoken: sessiontoken,
                exportType: "xls",
                param1:compareData,
                param2:comparePatchData},
                  function(resdata)
                  {
                        alert(resdata);
                  }
            );

我想要一些最佳实践,以便我可以使用枚举或数组将所有帖子参数存储在其中并在发布时使用它,这样我可以避免sessiontokenparam1的硬编码等等。什么可以解决?

修改

有时可能会发生我需要更改params的名称,所以我必须在任何地方编辑post方法,而不是如果所有的参数都在某些枚举或数组中在一个地方改变会容易得多。

2 个答案:

答案 0 :(得分:1)

如果您希望对象中的标签基于其他变量,则可以使用

进行
  var paramLabels = {"session": "sessionToken", "type": "exportType", ...}
  var paramValues = {}; 
  paramValues[paramLabels.session] =  sessionToken; 
  paramValues[paramLabels.type] = "xls"
  ...

  $.post(/"abc/export.action", paramValues, function(resdata) { alert(resdata);});

当后端的开发人员喜欢每五分钟更改一次参数的名称时,我无法真正看到这种方法的好处。

另一种处理方法是创建工厂方法或构建器

  function createParams(session, type, ...) {
     return { "sessionToken": session, "exportType": type, ...) }
  }

  var params = createParams(sessionToken, "xls", ...);

  var Parameters = function() {  
      this.session = function(session) { this.session = session; return this;}
      this.type = function(type) { this.type = type; return this;} 
      ...
      this.build = function() {     
            var params = {}
            !this.session || params.sessionToken = this.session;
            !this.type || params.exportType = this.type;
            ...
            return params;

      }
  } 

   var params = new Parameters().session(sessionToken).type("xls")...build();

这两种方法都只允许您定义一次参数的concreate名称。当需要不同的参数集时,后者可能更容易重用。

答案 1 :(得分:1)

您可以传递一个在代码中其他位置定义的对象,而不是将对象文字传递给$.post(),从而为多个帖子重复使用该对象。或者放入一个函数调用,该函数调用返回一个设置了适当参数的对象。

var postParams = {
  sessiontoken: sessiontoken,
  exportType: "xls",
  param1:compareData,
  param2:comparePatchData
};

$.post("/abc/export.action",
       postParams,
       function(resdata) { alert(resdata); });

$.post("/abc/import.action",
       postParams,
       function(resdata) { alert(resdata); });

// or use a function that can return a different object
// depending on some conditions (or parameters passed to
// the function though I haven't shown that)
function getPostParams() {
  if (someCondition)
    return postParams;
  else
    return {
      sessionToken : something,
      // etc.
    };
}

$.post("/abc/someother.action",
       getPostParams(),
       function(resdata) { alert(resdata); });