1

問題

ワーカーのリストを表示するビューがあります。このビューには、という名前のコントローラーメソッドを呼び出すボタンがありますrefresh。もともと私はcontentこのリストに設定していましたが、UIがちらつくことに気づきました。これは、タイマーで実行すると特に厄介です。

以下を使用して、ちらつきなくすべてを機能させることができました。

App.WorkersIndexController = Ember.ArrayController.extend
    refresh: ->
        console.log 'refreshing workers'
        # set a property to a new collection
        @set 'refreshing', App.Worker.find()

    # observer that watches the new collection load
    update: (->
        refreshing = @get 'refreshing'
        return unless refreshing.get('isLoaded')
        # what this question is about...
        Ember.run =>
            @set 'content', refreshing
    ).observes('refreshing.isLoaded')

ご覧のとおり、更新されたコンテンツを一時変数に設定し、コンテンツの読み込みを監視してからコンテンツを更新しています。Ember.runちらつきを完全に取り除く呼び出しを追加するまで、コンテンツのちらつきは少なくなりました。

ちらつきが発生している理由と、ちらつきがなくなる理由は理解しEmber.runていますが、私の質問は、ちらつきに頼らずにこれを解決するための最良の方法は何Ember.runですか?Ember.runに電話するのは、一種の最後の手段のように感じます...どんな助けでも大歓迎です!

編集:また、私は残り火のデータを使用していません。メソッドは次のfindようになります。

App.Worker.reopenClass
    find: ->
        console.log 'loading workers'
        workers = Em.A []
        request = $.getJSON '/api/admin/workers', (data) =>
            console.log ' -> loaded workers'
            data.forEach (d) =>
                worker = App.Worker.create(d)
                worker.set 'isLoaded', true
                workers.pushObject(worker)
        request.error =>
            console.log ' -> failed to load workers'
            workers.set 'isFailed', true
        request.complete =>
            workers.set 'isLoaded', true
        workers
4

1 に答える 1

1

私は、変更したばかりのオブジェクトのリストを固定することで、同様の状況でちらつきを回避しました。

最も単純なケースでは、名前を表示していて、作成できる要素が 3 つを超えることはないことを知っていたとしましょう。

App.names = [ 
    Ember.Object.create({name:"", active:false}),
    Ember.Object.create({name:"", active:false}),
    Ember.Object.create({name:"", active:false})
]

テンプレートを

{{#each App.names}}
    {{#if active}}
        <li> {{name}} </li>
    {{/if}}
{{/each}}

次に、実行して名前を追加できます

  App.names[0].set("name", "Frank");
  App.names[0].set("active", true);

ちらつきなしでリストを更新します。一度に変更されるのはリスト内の 1 つの要素だけなので、リスト全体が再描画されることによるちらつきはありません。

実際には、App.names を ArrayController にして、リストを適切に展開できるようにする必要があるかもしれませんが、その要点は機能します。

于 2013-02-14T20:50:17.243 に答える