当前位置: 首页 > 面试题库 >

插值不反映Angular应用中的最新值

钱欣悦
2023-03-14
问题内容

dropzone1数组的元素仅反映初始的top,left值,不反映最新的top,left值。

draw()功能我推toplefttopLeft阵列,最后把它推到dropzone1阵列内move()的功能,初始topleft值被示出,但它不反映最新的电流topleft的值。

export class FloorZoneComponent {

    urlFloorZoneIn: any;
    roomsFloorZoneIn: any;
    existingDroppedItemZoneIn: any[] = [];
    @Input() urlFloorZone;
    @Input() roomsFloorZone;
    @Input() currentBoxFloorZone;
    @Input() existingDroppedItem: any[] = [];
    dropzone1 = [];
    currentBox?: string = this.currentBoxFloorZone;
    mouse = {
        x: null,
        y: null,
        down: false
      };
    will_draw = false;
    left;
    top;
    topLeft = [];

    @ViewChild('parentparent') parentparent;

    @HostListener('mousedown', ['$event'])
    onMousedown(event) {
        this.mouse.down = true;
    }

    @HostListener('mouseup', ['$event'])
    onMouseup(event) {
        this.mouse.down = false;
    }

    documentMouseMove(e: MouseEvent) {
        // move logic
        if(!this.mouse.down) { return; }

        const container_rect = this.parentparent.nativeElement.getBoundingClientRect();
        this.mouse.x = e.clientX - container_rect.left;
        this.mouse.y = e.clientY - container_rect.top;
        if(!this.will_draw) {
          requestAnimationFrame(this.draw.bind(this));
          this.will_draw = true;
        }

    }

    draw() {
        this.will_draw = false;
        const { width, height} = this.parentparent.nativeElement.getBoundingClientRect();
        const perc_x = this.mouse.x / width * 100;
        const perc_y = this.mouse.y / height * 100;
        // -5 to center (elem has its width set to 10%)
        console.log('left', (perc_x - 5) + '%');
        this.left = perc_x - 5;
        this.topLeft = []
        this.topLeft.push(this.left);
        // -5 to center (elem has its height set to 10%)
        console.log('top', (perc_y - 5) + '%');
        this.top = perc_y - 5;
        this.topLeft.push(this.top)
    }

    ngOnChanges(changes: SimpleChanges) {
        if (changes.urlFloorZone && changes.urlFloorZone.currentValue) {
            this.urlFloorZoneIn = changes.urlFloorZone.currentValue;
        }
        if (changes.roomsFloorZone && changes.roomsFloorZone.currentValue) {
            this.roomsFloorZoneIn = changes.roomsFloorZone.currentValue
        }
        if(changes.existingDroppedItem && changes.existingDroppedItem.currentValue){
            this.existingDroppedItemZoneIn = changes.existingDroppedItem.currentValue;
        }        
    }


    move(box: string, toList: string[]): void { 
        box = this.currentBoxFloorZone;

        let objTemp:any = {
            pos:[]
          };

        objTemp.dis = this.currentBoxFloorZone;

        for(var i=0; i < this.topLeft.length; i++){
            objTemp.pos.push(this.topLeft[i]);
        }

        this.removeBox(box, this.dropzone1);
        toList.push(objTemp);

    }

    removeBox(item: string, list) {
            if (list.indexOf(item) !== -1) {
                list.splice(list.indexOf(item), 1);
            }

    }

    }

我通话move()功能和推动名和topleftdropzone1数组

<div (mousemove)="documentMouseMove($event)" #parentparent>

  <div class="dropzone" 
       (drop)="move(currentBox, dropzone1)">

  <div class="box"
       *ngFor="let existingZone of existingDroppedItemZoneIn">
    {{ existingZone.dis }}
    <span style="display: none">{{existingZone.left}}</span>
    <span style="display: none">{{existingZone.top}}</span>
   </div>

    <div class="box"
         *ngFor="let box of dropzone1" 
         (dragStart)="currentBox = box">
    {{ box.dis.dis }}
     <span style="display: none">{{box.pos[1]}}</span>
     <span style="display: none">{{box.pos[0]}}</span>
    </div>

</div>
</div>

我也可以登录最新topleft从价值在控制台draw() 的功能,但该*ngFor元素不反映最新的一个

更新1

添加stackblitz链接

在此链接问题中,这里是hello.component,我在其中分配top和left值,in draw()move()函数。

现在,我已经提供了静态数组的框值app.component,然后将其推入dropzone1存在问题的hello.component中的数组。

更新2

我想我已经解决了这个问题,但是如果有人建议的话该如何解决。

因此,每当放一个新盒子时,该move()函数就会被调用

(drop)="move(currentBox, dropzone1)"

从其中topleft值被推到框属性和插值到视图。现在topleft值从何处进入,它们来topleft自由draw()函数创建的数组。

因此,最初的topleft价值被插入。但当相同的元素被再次拖则仅draw()函数被调用topleft计算值,但没有得到推,因为move()当新的元素被删除功能只调用。

因此,如何将插值数据绑定到从draw()函数计算得出的top,left的最新值。请提出建议。


问题答案:

发生这种情况是因为move()仅当将块从 Gray区域之外移动时才调用your,但是draw()所有鼠标移动都调用了your 。

currentBox选择并移动位置时,您需要更新位置。

  draw() {
    const movingBlockIndex = (this.dropzone1.indexOf(this.currentBox));
    if (movingBlockIndex > -1) {
      this.will_draw = false;
      const { width, height } = this.parentparent.nativeElement.getBoundingClientRect();
      const perc_x = this.mouse.x / width * 100;
      const perc_y = this.mouse.y / height * 100;
      // -5 to center (elem has its width set to 10%)
      // console.log('left', (perc_x - 5) + '%');
      this.left = perc_x - 5;
      this.topLeft = []
      this.topLeft.push(this.left);
      // -5 to center (elem has its height set to 10%)
      // console.log('top', (perc_y - 5) + '%');
      this.top = perc_y - 5;
      this.topLeft.push(this.top)
      this.dropzone1[movingBlockIndex].pos[0] = (perc_x - 5);
      this.dropzone1[movingBlockIndex].pos[1] = (perc_y - 5);
    }
  }


 类似资料:
  • 我现在正在学习React,但在重新渲染组件时遇到了问题。应用程序。js代码: 问题是不是最新的。它总是弱智,这是以前的状态。我试图调用一个在和的回调中,但是它仍然不起作用,我不知道为什么。

  • 我使用Redux和RxJS Angular(4)实现来管理状态 我正在监听一个事件(产品列表中选定产品ID的更改),所以我们称之为selectedproductId$。 当相关发射器发出一个新的selectedId值时,我想从这个可观察值中执行一个,以及从另外两个可观察值中发出的最新值(比如;和)。 因此,触发更改应该是selectedproductID,我们将使用product详细信息和prod

  • 问题内容: 我有一个待办事项列表,如果用户单击“完成”,希望将数组中该项目的状态设置为“完成”。 这是我的动作: 这是我的减速器: 我遇到的问题是新状态在所选项目上不再具有与该待办事项相关的文本,并且ID不再存在。这是因为我要覆盖状态并忽略以前的属性吗?我的对象项onload看起来像这样: 如您所见,我要做的就是将完成值设置为true。 问题答案: 您需要转换待办事项数组以更新适当的项目。Arra

  • 我正在做一个数据密集的角度项目,在这个项目中,我有一个ng重复,其中许多值每秒更新一次。如果一个值为空,它现在会更新DOM以显示一个空值;这是正确的行为。 需要的解决方案 我想要的是一个过滤器或表达式,当新值为空或NULL时,它不会更新DOM中的值。我相信他们称之为“锁定数据”。 可能的解决方案 我用$watch找到了几个可能的解决方案,但我相信它们不适合ng重复,或者至少效率不高:angular

  • 我有一个函数反应组件,它有一个从10000开始到0的计数器。 我正在组件安装期间使用useEffect挂钩设置setInterval回调。然后,回调更新计数器状态。 但是不知道为什么,值从来没有减少过。每次回调运行为10000。 (我正在使用react 功能组件如下所示: 这里是codesandbox的链接:链接

  • 问题内容: 我已经在现有的mysql数据库中反映了表的负载。我想表示的是,任何表中具有特定名称的任何列默认为datetime.now()。但是,天真地遍历表和列,仅对那些我发现具有特定名称的表和列设置默认设置是行不通的。session.flush()我收到以下错误: 这似乎与对_set_parent的调用(以及在sqlalchemy.schema的第721行中的调用)有关。 有谁知道是否有办法做到