在GridX树周围使用Dojo方面时,对“this”的引用丢失

xlpyo6sf  于 2022-12-20  发布在  Dojo
关注(0)|答案(2)|浏览(174)

我正在尝试为GridX树的expand函数使用一个around方面。
简化代码如下所示:

var myGrid = ...; // features a tree
var myConditional = ...; // some boolean

dojo.aspect.around(myGrid.tree, "expand", function(original) {
    return function(id, skip) {
        // TODO check the conditional and decide whether 
        // to return the deferred function as is, or 
        // return a function that does nothing but log into the console
        var deferred = original(id, skip);
        return deferred;
    };
});

不幸的是,dojo方面的调用 as is(即,没有对我的条件进行任何检查,等等)是有问题的。
单击expando后,控制台中会抛出一个错误:

Uncaught TypeError: t.isExpanded is not a function

...指向GridX树模块的expand原始函数的主体:

var d = new Deferred(), t = this;
if(!t.isExpanded(id) && t.canExpand(id)){ // here

显然,我对aspect around工作方式的解释是错误的,t的作用域变成了Window对象,而不是树本身。
我希望有我可以使用的快速修复/变通方案?

澄清我的实际目的

在某些情况下,网格底层存储所查询的后端将在短时间内无法访问。按照实现的方式,展开树的节点将查询后端。在后端不可用的非常短的窗口期间(我可以从前端代码中很容易地知道这一点),我希望忽略对expandos的单击。

pbwdgjma

pbwdgjma1#

试着把树示例绑定到你的函数上,比如:

var myGrid = ...; // features a tree
var myConditional = ...; // some boolean

const condExpand = function(id, skip) {
        var deferred = original(id, skip);
        return deferred;
    }.bind(myGrid )

dojo.aspect.around(myGrid.tree, "expand", function(original) {
    return condExpand
});

我不确定在您的案例中,某个特定的上下文在哪里丢失了,但是您可以利用它使它为您工作。

    • 更新日期:**

尝试重现该情况。以下是工作示例:

const testObject = {    
      isNumeric: function(number) {
        return typeof number === "number"
      },
      testMethod: function() {
        console.log('testMethod', this)
        console.log("Is 5 a number: ", this.isNumeric(5))
      }
    }

    const aroundFunc = function(originalTestmethod){
        return function(method, args){
          // doing something before the original call
          console.log("Before", this)

          //Here context still corect. 
          //So bind it to passed here original method:

          var deferred = originalTestmethod.bind(this)(method, args)

          // doing something after the original call
          console.log("After")
          return deferred;

        }
      }

require(['dojo/aspect'], function(aspect) {
   aspect.around(testObject, "testMethod", aroundFunc)  
   testObject.testMethod()  

})

JS Fiddle

798qvoo8

798qvoo82#

我找到了一个“解决方案”,看起来绝对野蛮,但对我有效。
希望有人有更好的主意,可能使用dojo/aspect。
我已经将Tree.js模块的代码复制到我自己的实现中,只添加了我自己的条件:

myGrid.tree.expand = function(id, skipUpdateBody)  {
    var d = new dojo.Deferred(),
        t = this;
    // added my condition here
    if ((!t.isExpanded(id) && t.canExpand(id)) && (myCondition)) {
        // below code all original
        t._beginLoading(id);
        t.grid.view.logicExpand(id).then(function(){
            dojo.Deferred.when(t._updateBody(id, skipUpdateBody, true), function(){
                t._endLoading(id);
                d.callback();
                t.onExpand(id);
            });
        });
    }else{
        d.callback();
    }
    return d;
};

相关问题