Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
angular2砌体总是在末端添加项目,而不是按照正确的顺序添加项目_Angular_Masonry - Fatal编程技术网

angular2砌体总是在末端添加项目,而不是按照正确的顺序添加项目

angular2砌体总是在末端添加项目,而不是按照正确的顺序添加项目,angular,masonry,Angular,Masonry,使用时,它将按照正确的初始顺序(即它们在ngFor的数组中出现的顺序)绘制砖块,但是当从订阅中获得新数组并且它有一个新项目(甚至只是一个更改的项目)时,新/更改的项目总是附加到末尾,而不是放在正确的位置(它在阵列中的位置) 在订阅中获取数组,如下所示: this.thingService.getThings().takeUntil(this.unsubscribe) .subscribe( (things:IThing[]) => { thi

使用时,它将按照正确的初始顺序(即它们在
ngFor
的数组中出现的顺序)绘制砖块,但是当从订阅中获得新数组并且它有一个新项目(甚至只是一个更改的项目)时,新/更改的项目总是附加到末尾,而不是放在正确的位置(它在阵列中的位置)

在订阅中获取数组,如下所示:

    this.thingService.getThings().takeUntil(this.unsubscribe)
        .subscribe( (things:IThing[]) => {
            this.things = things;
            /*This should reload and resort the things, but it doesn't.*/
            if (this.masonry){
                this.debug("yes this is being called");
                this.masonry._msnry.reloadItems();
                this.masonry.layout();
            }
        });
此订阅工作正常,如果我输出
内容,则它们将按正确顺序按预期进行。出于绝望,我正在调用砌体上的
重新加载项目
布局
(从
@ViewChild(angularproash)private-mashine:angularproash;
)。调用成功且无错误,但项仍不会按其在数组中的显示顺序绘制

以下是我的HTML模板:

    <masonry *ngIf="things && things.length"  [options]="{ }">
        <masonry-brick *ngFor="let thing of things" >
            Hi, my name is {{thing.name}}
        </masonry-brick>
    </masonry>

嗨,我的名字是{{thing.name}
同样,需要澄清的是,在初始加载(由同一订阅驱动)时,项目的顺序是正确的


另一个注意事项-如果我更改(或添加)了另一个项目,则错误附加到末尾的前一个项目现在将正确排序在其正确位置,并且新项目位于末尾(无论是否应该)。因此,在任何时候,只有一项不合适。

我发现我可以通过对砌体调用进行此更改来解决此问题(特别是将它们放在
setTimeout
调用中):

请注意,这两个调用都是必需的。
layout
本身不会更改任何内容,
reloadItems
最终将使其正确排序,但某些事件必须首先触发
layout

我仍然有兴趣了解原因。在我调用
reloadItems
layout
时,即使没有
setTimeout
,数组也已更新,新内容应立即可用于重新加载


…因此,我发布此答案是为了帮助其他有相同问题的人,但了解这里实际发生的情况仍然很好。

我发现我可以通过对砌体调用进行此更改来解决此问题(特别是将它们放在
setTimeout
调用中):

请注意,这两个调用都是必需的。
layout
本身不会更改任何内容,
reloadItems
最终将使其正确排序,但某些事件必须首先触发
layout

我仍然有兴趣了解原因。在我调用
reloadItems
layout
时,即使没有
setTimeout
,数组也已更新,新内容应立即可用于重新加载


…因此,我发布此答案是为了帮助其他有相同问题的人,但如果能够了解这里实际发生的情况,那就太好了。

当您运行reloadItems时,视图尚未更新。请参阅当您运行reloadItems时,视图尚未更新。请参阅
setTimeout( () => {
    if (this.masonry){
        this.masonry._msnry.reloadItems();
        this.masonry.layout();
    }
});