Aurelia:使用Map值刷新视图

时间:2016-10-05 22:02:45

标签: javascript aurelia

在viewModel中,我有一个每5秒刷新一次的地图:

 Constructor(){
        this myMap=new Map();

    }
    activate(){
       //for example :
       value=7;
       id=1;
       setInterval(()=>{
          this.myMap.set(id, value++);
          });
        },5000);
    }

在视图中:

<template>
  <div class="container">
  <h2>${titre}</h2>
  <p class="nb-values-OK">
    ${myMap.get(1)}
  </p>
  </div>
</template>

当间隔触发时没有任何反应......当定时器触发时,有没有办法让我的视图刷新?

事实上,在现实世界中,我有车道,在这些车道上有一些活动;所以我的地图会在车道ID与该车道上发生的活动数量之间建立联系。在我看来,Map是最简单的排序方式...... 无论如何,我的第一个问题涉及每隔5秒刷新视图的方法。

提前感谢您的帮助。 `

(希望我的英语足以让人理解:))。

1 个答案:

答案 0 :(得分:4)

您需要在回调函数中使用bind(this)来访问内部模型数据,例如this.myMap

Constructor(){
    this myMap=new Map();
}

activate(){
    //for example :
    value=7;
    id=1;
    setInterval(function(){
        this.myMap.set(id, value++);
    }.bind(this), 5000);
}

如果您需要观察和更新复杂数据,则可以使用many bindable behaviors。最简单的解决方案 - 使用信号api(每次发送特殊信号时,视图可绑定值都会更新):

<强> model.js

import {inject} from 'aurelia-dependency-injection';
import {BindingSignaler} from 'aurelia-templating-resources';

@inject(BindingSignaler)
export class SampleView {

  constructor(signaler) {
    this.signaler = signaler;
  }

  activate() {
    this.data = new Map();
    this.data.set(1, 1);

    // data changing by interval and send update signal
    setInterval(function(){
      this.data.set(1, this.data.get(1) + 1);
      this.signaler.signal('need-update');
    }.bind(this), 1000);
  }
}

<强> model.html

<template>
  <h1>${data.get(1) & signal:'need-update'}</h1>
</template>

P.S。

对于自定义属性或表达式观察者,您可以使用BindingEngine(在地图值更改时创建事件)。请参阅该主题中的示例:Property change subscription with Aurelia

你也可以尝试BindingEngine中的expressionObserver(观察数组或&#34;内部&#34;对象值):https://stackoverflow.com/a/33482172/1276632