1

有关“Ext.applyIf”函数和双管道的参考,请参阅这些文章。

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;
    }
});
4

2 回答 2

3
  1. 双管道是指定默认值的 javascript 技巧。就像 Evan 建议的那样,它经常用于避免空指针问题。在var a = b||{}a 的示例中,即使 b 为空或未定义,也保证不为空。默认回退使a = {}(空对象)。
  2. ApplyIf方法将属性从源复制到目标,注意不要覆盖任何现有属性。在以下示例中,只要 params 没有定义这些属性,就会将 extraParams 属性添加到 params 属性中。

    Ext.applyIf(参数,extraParams)

实际代码是:

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

它将 extraParams 添加到 params 对象中,小心避免任何空指针问题,并确保不覆盖 params。

于 2012-12-06T05:54:42.910 回答
1

考虑:

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

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

所以本质上,我们是说,如果传递给方法的 cfg 是“假的”(读取、未定义或 null),则将其设置为空对象,这样在读取“x”属性时就不会出现引用错误。

于 2012-09-26T00:59:14.207 回答