2014-03-24 108 views
0

新入門並試圖找出最佳實踐。問題是,當我切換到日曆模板時,fullCalendar呈現兩個日曆。正在渲染EmberJS視圖兩次

這裏是控制檯輸出:

Attempting transition to calendar ember.js?body=1:3499 
Transition #3: calendar: calling beforeModel hook ember.js?body=1:3499 
Transition #3: calendar: calling deserialize hook ember.js?body=1:3499 
Transition #3: calendar: calling afterModel hook ember.js?body=1:3499 
Transition #3: Resolved all models on destination route; finalizing transition. ember.js?   body=1:3499 
Rendering calendar with <[email protected]:calendar::ember635> Object {fullName: "view:calendar"}   ember.js?body=1:3499 
Transitioned into 'calendar' ember.js?body=1:3499 
Transition #3: TRANSITION COMPLETE. 

這裏是我的代碼:

router.es6

var Router = Ember.Router.extend({ 
    location: 'history' 
}); 

Router.map(function() { 
    //... 
    this.route('calendar'); 
    //... 
}); 

export default Router; 

路線/ calendar.es6

export default Ember.Route.extend(); 

的意見/ calendar.es6

var CalendarView = Ember.View.extend({ 
    didInsertElement: function() { 
    $('#calendar').fullCalendar(); 
    } 
}); 

export default CalendarView; 

模板/ calendar.hbs

{{#view "calendar"}} 
    <nav> 
    <h1>Schedule</h1> 
    </nav> 
    <article id="schedule"> 
    <section> 
     <div id='calendar'></div> 
    </section> 
    </article> 
{{/view}} 

回答

1

而不是使用didInsertElement鉤上的看法,嘗試把你的CalendarRoute如下:

model: function(){ 
    Ember.run.scheduleOnce('afterRender', this, function(){ 
     $('#calendar').fullCalendar(); 
    }); 
} 
+0

正確的想法,只是沒有把它放到路線#模式。相同的代碼可以在View#didInsertElement中。 –

+0

@Ember Sherpa:這個位置變化的意義是什麼? – gravityplanx

+0

更清潔的代碼?應該使用'model'鉤子返回該路線所需的模型。如果可能的話,避免掛鉤中的其他事物。 – fanta

1

這裏是更多慣用的解決方案。當您使用插件時,您需要手動從DOM中分離它們的事件偵聽器,否則您將創建內存泄漏。

var CalendarView = Ember.View.extend({ 

    renderCalendar: function() { 
    var self = this; 
    Ember.run.schedule('afterRender', function() { 
     self.calendar = $('#calendar').fullCalendar(); 
    }); 
    }.on('didInsertElement'), 

    removeCalendar: function() { 
    // Detach any calendar events 
    this.calendar = null; 
    delete this.calendar; 
    }.on('willDestroyElement') 

}); 

export default CalendarView;