2

私はこのコードを持っています( http://jsfiddle.net/stephane_klein/gyHmS/2/ ):

App = Ember.Application.create({});

App.Item = Ember.Object.extend({
    title: null,
    parent: null
});

App.MyList = Ember.Object.extend({
    title: null,
    content: [],
    changed: function() {
        console.log('here');
    }.observes('content')
});

App.list = App.MyList.create({
    title: "foobar",
    content: [
        App.Item.create({
            item: "item1"
        }),
        App.Item.create({
            item: "item2"
        })
    ]
});
console.log(App.list.content);

App.list.content.pushObject(
    App.Item.create({
        item: "item3"
    })
);
console.log(App.list.content);

「console.log('here')」が呼び出されないのはなぜですか?

App.ItemがApp.MyListに挿入されたときにApp.Item.parentを設定したい。App.MyList.content フィールドを観察する方法がわかりません。

ご協力いただきありがとうございます。

よろしく、ステファン

4

1 に答える 1

5

content プロパティを変更しているのではなく、そこにオブジェクトをプッシュしているだけです。次の 2 つの解決策があります。

  • コンテンツの各項目を ( を使用して) 観察.observes('content.@each')できますが、メソッドが複数回呼び出される可能性があることに注意してください。
  • または、このプロパティが変更されたことを手動で通知します (を使用this.notifyPropertyChange('content'))

これが最初の解決策です: @each を使用した jsfiddle

そして、これが2番目の解決策です:notifyPropertyChangeを使用したjsfiddle

App.list.contentまた、直接ではなくApp.list.get('content')代わりに使用する必要があることに注意する必要があります。詳細については、Roy Daniels が書いたこの記事を参照してください。

編集

@eachの使用が若干変更されていることに注意してください。Ember.Array#@each のドキュメントには次のように書かれています。

配列の個々のプロパティを監視するために使用できる特別なオブジェクトを返します。このオブジェクトで同等のプロパティを取得するだけで、メンバー オブジェクトの名前付きキーに自動的にマップされる列挙型が返されます。

配列に追加または削除されるアイテムを監視するだけの場合は、@each の代わりに [] プロパティを使用します。

例でそれを見てみましょう:

App.Post = Ember.Object.extend({
  createdAt: null
});

App.Blog = Ember.Object.extend({
  posts: null,

  init: function() {
    this._super();
    this.set 'posts', [];
  },

  newerPost: function() {
    return this.get('posts').sortBy('createdAt').get('firstObject');
  }.property('posts.@each.createdAt'),

  postsCount: function() {
    return this.get('posts.length');
  }.property('posts.[]')
});

newerPost各 の特定のプロパティを観察する必要がありますが、配列がいつ変更されるかを知る必要があるだけpostsです。postsCountposts

于 2012-05-15T14:47:54.860 に答える