0

我正在编写一个小部件,它采用所有子<img>标签,获取src属性,并且应该创建一个无序列表,其中子列表元素的背景是上述来源。但是,当我创建列表元素并告诉 dojo 将它们放在 master<ul>中时,它们最终会出现在外面。这个小部件是链中的第三个,如下所示:

+ ImageBox
    ++ AnimImageBox
    ++ SlideImageBox
         +++ AnimSlideImageBox (TBA)

主列表创建:

buildRendering : function(){
    this.inherited(arguments);

    // Create the slidebox <ul>
    this.slideHolder = domConstruct.create('ul', {
        className : 'imagebox-slide'
    }, this.domNode, 'first');
}

这是该_lazyLoad方法的块。它最初是在根ImageBox类中定义的,在这里被覆盖,称为 inside postCreate()

var self = this;
query('img', this.domNode).forEach(function(image){
    // With each found image, push the src attribute into our class-wide array
    var src = domAttr.get(image, 'src');
    self.images.push(src);

    // Create an <li> for the slide block
    var li = domConstruct.create('li', {
        className : 'slide'
    }, self.slideHolder);

    // Destroy the <img /> element
    domConstruct.destroy(image);
});

类结构/方法调用概述:

ImageBox.js

buildRendering():
    - Creates the preloader
postCreate(): 
    + Calls _lazyLoad to extract image data, load, show progress, etc.

SlideImageBox.js(我遇到的问题)

buildRendering():
    - Calls the superclass method, and then creates the <ul> element, placing to this.domNode
postCreate():
    - Just calls the superclass postCreate() method (via this.inherited(args))
_lazyLoad():
    - Overridden completely, is called correctly as tested with various log() calls.

预期结果

<ul class="imagebox-slide">
    <li class="slide"><!--Content --></li>
    <li class="slide"><!--Content --></li>
    <li class="slide"><!--Content --></li>
</ul>

结果

<ul class="imagebox-slide"></ul>
<li class="slide"><!--Content --></li>
<li class="slide"><!--Content --></li>
<li class="slide"><!--Content --></li>

在每一步我都可以log()找到节点,所以我知道它们存在,但是这domConstruct.create()条线并没有将它们放入节点中。我已经不止一次像这样处理道场了,所以也许这与我在某个地方的继承有关?

也许已经很晚了,需要一双新的眼睛,或者这里有其他事情在起作用?

编辑

@DavidMcMullin,place我遇到的问题是隐式调用的create,抱歉我没有强调这一点。

@Frode,它需要从其他 2 个 .js 文件继承,我没有使用足够的提琴手来知道如何设置它,不过我会调查一下。

@Stephen,就是这样,结果,不知何故,创建顺序已经关闭,即使log()声明告诉我它不是,我想我已经尝试过了......我必须进行一些重构以适应在超类中调用的方法,但很高兴它现在可以工作。提出答案,我会接受。

4

1 回答 1

0

看不到此代码有任何明显错误的地方。我认为它应该工作。这可能与各个节点的放置顺序有关。

您是否尝试过在postCreate中运行buildRendering代码?看起来<ul>元素是在放置<li>之后创建的(只是猜测) - 尝试将放置参数'first'更改为'last'以查看它是否出现在<li>之后's,如果确实如此,那么它会在创建<li>之后运行(只是一种预感,在黑暗中刺伤,因为在我看来一切都很好)。

如果这可行,那么可能值得看看this.inherited(arguments);的位置。方法内。也许尝试将它移到buildRendering的末尾(在创建<ul>的代码之后)。

于 2013-02-07T07:00:40.477 回答