官术网_书友最值得收藏!

Classical change detection

Let's take a look at a simple example, which doesn't use any framework. Suppose, we have a model called User, which has a property called name:

class User extends EventEmitter { 
  private name: string;
 
  setName(name: string) { 
    this.name = name; 
    this.emit('change');
  }
 
  getName(): string { 
    return this.name;
  } 
} 

The preceding snippet again uses TypeScript. Do not worry if the syntax does not look familiar to you, we will make an introduction to the language in the next chapter.

The user class extends the EventEmitter class. This provides primitives for emitting and subscribing to events.

Now, let's define a view, which displays name of an instance of the User class, passed as an argument to its constructor:

class View { 
  constructor(user: User, el: Element /* a DOM element */) { 
    el.innerHTML = user.getName();
  } 
} 

We can initialize the view element as shown here:

let user = new User(); 
user.setName('foo'); 
let view = new View(user, document.getElementById('label')); 

As the end result, the user will see a label with the content foo. However, changes in user will not be reflected by the view. In order to update the view when the name of the user changes, we need to subscribe to the change event and then update the content of the DOM element. We need to update the View definition in the following way:

class View { 
  constructor(user:User, el:any /* a DOM element */) { 
    el.innerHTML = user.getName(); 
    user.on('change', () => { 
      el.innerHTML = user.getName();
    }); 
  } 
} 

This is how most frameworks used to implement their change detection before the era of AngularJS.

主站蜘蛛池模板: 永吉县| 桐梓县| 阿坝| 永川市| 白城市| 吕梁市| 罗城| 商都县| 星座| 广州市| 望江县| 乡城县| 承德市| 莱州市| 海丰县| 油尖旺区| 荆门市| 尉氏县| 科技| 南通市| 封开县| 杭锦旗| 紫金县| 台北市| 江西省| 昌邑市| 高阳县| 探索| 博爱县| 大兴区| 德阳市| 普宁市| 阳城县| 安阳市| 宕昌县| 鲁甸县| 临沭县| 阜阳市| 旌德县| 白水县| 郧西县|