5

我开始冒险进入 Angular2 进行一个爱好项目,并且遇到了一些我不知道如何调试或搜索的东西。

我开始使用ng2-play存储库。

我有两个简单的类(这篇文章的代码被大大简化了):

words-ui.js

export class WordsUI {
  constructor() {
    new Words(data => this.words = data);
  }
}

单词-ui.html

<ol *if="words" reversed>
  <li *for="#entry of words" title="Word for week starting {{entry.date}}">{{entry.word}}</li>
</ol>

words-data.js

export class Words {
  constructor(cb) {
    firebase
      .child('words')
      .on('value', data => cb(data.val()));
  }
}

唯一不能正常工作的是“范围”识别出属性的值words已经更新。这意味着当 UI 加载时,单词列表中不会显示任何内容。如果我随后通过 UI 向列表中添加一个单词,则所有单词以及添加的单词都会显示出来。或者,如果我输入一个 setTimeout 来“重新加载”words具有自身值的属性,它们就会显示出来。

我想我没有为此使用正确的模式,但是我在哪里可以找到哪种模式更适合这种情况。我有点迷失在新的 ES6 模块系统以及:TypeScript 和 AngularJS 2。

我想我已经提供了代码的相关部分来说明问题,但如果没有,请告诉我,我可以努力组合更好的东西。

更新 1:添加了视图文件。对实例words“上下文”的更改未反映。WordsUI

4

1 回答 1

2

因此,在最初遇到这种情况几个小时后,我找到了一个答案——或者根据你的观点来解决这个问题。这个爱好项目的最终存储库位于GitHub Weekly Word上。

问题

我实际上是在尝试从传递给 Word 构造函数的回调中设置 WordsUI 实例的属性。我认为不知何故没有被拾起,而是“范围观察者” zones.js(我认为)。

决议

我将 Word 实例中的数据读取转移到实例的后续调用中;而不是试图变得棘手并将其保留在传递给构造函数的回调中。

我不认为这种方法 - 我最终使用的方法 - 一定是劣质的,以前的优势也不是真的在任何方面。

words-ui.js

export class WordsUI {
  constructor() {
    this words = new Words();
    this.update();
  }

  update() {
    this.words
        .read(words => {
            this.wordList = words;
        })
  }
}

words-data.js

export class Words {
  constructor() {
    firebase = new Firebase('http://weekly-word.firebase.com').child('words');
  }

  read(cb) {
    firebase
        .on('value', data => {
            cb(data);
        })
  }
}
于 2015-05-07T19:03:13.830 回答