2012-09-26 54 views
1

請參閱這些文章以參考「Ext.applyIf」函數和雙管道。ExtJS 4:什麼適用ExtJS代碼中使用兩個管道?

http://docs.sencha.com/core/manual/content/utility.html

http://homepage.ntlworld.com/kayseycarvey/controlflow4.html

誰能解釋這是什麼邏輯在ExtJS的框架做什麼?我想確保我的解釋在管道的第一行(特別是)是正確的。

 var params = Ext.applyIf(operation.params || {}, this.extraParams || {}), request; 
     params = Ext.applyIf(params, this.getParams(params, operation)); 
     if (operation.id && !params.id) { 
      params.id = operation.id; 
     } 

從ASP.NET ASMX自定義服務器代理類措施:

Ext.define('Ext.ux.AspWebAjaxProxy', { 
    extend: 'Ext.data.proxy.Ajax', 
    require: 'Ext.data', 

    buildRequest: function (operation) { 
     var params = Ext.applyIf(operation.params || {}, this.extraParams || {}), request; 
     params = Ext.applyIf(params, this.getParams(params, operation)); 
     if (operation.id && !params.id) { 
      params.id = operation.id; 
     } 

     params = Ext.JSON.encode(params); 

     request = Ext.create('Ext.data.Request', { 
      params: params, 
      action: operation.action, 
      records: operation.records, 
      operation: operation, 
      url: operation.url 
     }); 
     request.url = this.buildUrl(request); 
     operation.request = request; 
     return request; 
    } 
}); 

回答

3
  1. 雙管道是一個JavaScript技巧來指定默認值。像埃文建議它經常用來避免空指針問題。在var a = b||{}的示例中,即使b爲空或未定義,也保證a不爲空。默認後退使得a = {}(空對象)。
  2. ApplyIf方法複製從源到目標的屬性注意不要覆蓋任何現有的屬性。在下面的示例中,只要params沒有定義這些屬性,就會將extraParams屬性添加到params屬性中。

    Ext.applyIf(參數,可以extraParams)

實際的代碼是:

Ext.applyIf(operation.params || {}, this.extraParams || {}), 

這增加extraParams到params對象小心避免任何空指針的問題,並確保不覆蓋PARAMS 。

1

考慮:

function foo(cfg) { 
    cfg = cfg || {}; 
    console.log(cfg.x); 
} 

foo({x: 1}); 
foo(); 

所以基本上,我們說,如果CFG傳遞給方法是「falsy」(讀取,未定義或null),然後將其設置爲空對象,以免在讀取「x」屬性時發生引用錯誤。