2016-10-17 3 views
0

У меня есть объект модели, представляющий «игроков» в БД. в его реализации есть массив игроков, с которыми я хотел бы привязываться от разных виртуальных машин в своем приложении. например:Собственность и коллекция наблюдателя в Aurelia не поднимает свойствоChanged событие

import {Players} from './models/players'; 
import {inject, BindingEngine} from 'aurelia-framework'; 

@inject(Players,BindingEngine) 
export class App { 

    constructor(playersProvider,bindingEngine) { 
    this._playersProvider = playersProvider; 
    this._bindingEngine = bindingEngine; 
    this._subscription = this._bindingEngine.propertyObserver(this,this._playersCount) 
     .subscribe(this.objectValueChanged); 
    } 

    async activate() { 
    await this._playersProvider.initialize(); 
    this._playersCount = this._playersProvider.players.length; 
    } 

    objectValueChanged(newVal,oldVal) { 
    console.log("new : " + newVal + ", old val : " + oldVal); 
    } 

    deactivate() { 
    this._subscription.dispose(); 
    } 
} 

, к сожалению, при внесении изменений в массив игроков (из других частей в приложении) изменение не отражается в _playersCount собственности. например - Метка UI, связанная с этим свойством, не обновляется, а objectValueChanged никогда не вызывается.

U имеет ту же самую проблему в другой виртуальной машине с сервером collectionObserver в том же массиве.

любая помощь?

+0

Синтаксис: this._bindingEngine.propertyObserver (this, '_playersCount') ' –

ответ

1

Вы пытались объявить _playersCount в конструкторе, прежде чем подписываться на него?

Также synthax не кажется правильным, оно должно быть в соответствии с this article:

import {BindingEngine, inject} from 'aurelia-framework'; 

@inject(BindingEngine) 
class MyClass { 
    constructor(bindingEngine) { 
    this.bindingEngine = bindingEngine; 
    this.observeMe = 'myvalue'; // the property is first initialized in the constructor 

    let subscription = this.bindingEngine 
     .propertyObserver(this, 'observeMe') // <= you wrote this._bindingEngine.propertyObserver(this,this.observeMe) 
     .subscribe(this.objectValueChanged); 

    // Dispose of observer when you are done via: subscription.dispose(); 
    } 

    objectValueChanged(newValue, oldValue) { 
    console.log(`observeMe value changed from: ${oldValue} to:${newValue}`); 
    } 
} 

Асинхронный ключевое слово может повлиять на поведение. Если он все еще не работает, вы можете использовать агрегатор событий для трансляции этого изменения.