【问题标题】:Linq.js scopingLinq.js 作用域
【发布时间】:2013-12-08 09:09:24
【问题描述】:

我被以下情况困住了。我有一个 select 语句,它使用当前范围 me 中的一个函数。如何将me 放入 select 函数中?

var me = this;
var results = Enumerable
              .from(jsonData) 
              .select('x,i=>{abbr:me.transform(x), name:x}')
              .toArray(); //me.transform(x) will hit error

'me' 是动态生成对象的一个​​实例,me.transform(x) 使用 'me' 中的其他依赖项也可以正常工作。这意味着我不能创建 'me.transform()' 全局函数。


编辑

var me = this;
var results = Enumerable
              .from(jsonData) 
              .select(function(x,i){
                  return {abbr:me.transform(x), name:x};
              }).toArray(); 

实际上,这个修改会起作用,但是,我想知道如何使快捷语法起作用。

【问题讨论】:

    标签: javascript linq.js


    【解决方案1】:

    您可以做的是将您的对象投影到一个复合对象上,该复合对象既包含集合中的项目,也包含您要引入查询的对象。

    您可以使用这个Capture 函数来捕获变量:

    function Capture(bindings, name) {
        var benumerable = Enumerable.From(bindings),
            itemname = name || 'Item';
        return function (e) {
            return e.Select(function (item) {
                return benumerable.Concat(Enumerable.Return({ Key: itemname, Value: item }))
                    .ToObject("$.Key", "$.Value");
            });
        };
    }
    

    Let 绑定中使用它。

    var query = Enumerable.From(data)
        .Let(Capture({ Me: me }))
        .Select("{ abbr: $.Me.transform($.Item), name: $.Item }")
        .ToArray();
    

    【讨论】:

      【解决方案2】:

      我的错。这是你的意思吗?

      var me = this;
      var results = Enumerable
                .from(jsonData) 
                .select('x,i=>{abbr:' + me.transform(x) + ', name:x}')
                .toArray(); //me.transform(x) will hit error
      

      【讨论】:

      • 变量“我”中有什么?它只是一个字符串吗?它的目的是什么?
      • 抱歉,它不起作用,因为您将参数 (x) 拖出,而 x 现在来自引用的 'x,i=>...' 上下文中的任何地方。我猜这个技巧更具体地体现在 Linq.js 如何形成其快捷语法。请查看我的编辑。
      猜你喜欢
      • 2013-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多