emberjs组件不会重新呈现组件来更新fullcalendar

时间:2017-12-01 21:11:26

标签: ember.js fullcalendar ember-cli ember-router ember-components

我正在使用emberjs和Jquery fullcalendar构建日历应用程序。 fullcalendar通过emberjs组件呈现。但是,当通过窗体创建新事件并调用路径refresh()方法时,组件不会重新渲染或重绘自身。因此,要在fullcalendar上查看新事件,我必须手动刷新页面。如何在创建新事件时让组件重新呈现。在使用事件/索引路由和模板之前,我已尝试使用事件路由和模板。

应用/事件/模板/ index.hbs

 {{cal-event model=model event=model refreshModel='refreshModel'}}

应用程序/路由/活动/ index.js

import Route from '@ember/routing/route':
export default Route.extend({
   model(){
     let model = this.get('store').findAll('event', {reload: true});
     return model;
   },

   actions: {
     refreshModel(data) {
       let e = data.get('start');
       let d = data.get('description');
       let f = data.get('finish');
       let event = this.get('store').createRecord('event', {description: d, start: e, finish: f})

       event.save().then((e) => {
         this.refresh(); 
         this.transitionTo("events")
       }, function(e) {
         console.log("event error", e)
       })   
     }
   }
 });

应用/组件/ CAL-event.js

 import Component from '@ember/component';
 import EmberObject, { computed, observer } from '@ember/object';
 export default Component.extend({
   event: '',

   didUpdateAttrs(data) {
     console.log('didUpdatedAttrs called', data);
   },

   didRender() {
     console.log('didRender');
   },

   didInsertElement() {
     this._super(...arguments);
     this.$().attr('contenteditable', true);
     return this.$("#calendar").fullCalendar({
       events: this.eventJSON(),
       defaultView: 'agendaWeek'
     });
   },

   eventJSON() {
     return this.get('model').map(function(event) {
      return event.get('toJSON');
     });
   },

   getnewEvent: computed('newEvent', function(){
     console.log('getnewEvent',  this.get('newEvent'));
   }),

   modelChanged: Ember.observer('model', function(){
     console.log("model changed!");
   }), 

  eventsDidChange: Ember.observer('model.[]', function() {
    this.$("#calendar").fullCalendar({
      events: this.eventJSON,
      defaultView: 'agendaWeek'
    });
  }),

   actions: {
     createEvent: function(param) {
       this.sendAction('refreshModel', param);
     }
   }
 });
更新。

我添加了didUpdateAttrs和didRender()。

更新2

我从bendemboski得到了另一个建议,我应该尝试在模型数组中添加一个观察者,如Ember.observer('model。[]')。它没有用,组件没有被重新渲染,fullcalendar也没有显示新事件。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

选项1:您当前的观察者解决方案将起作用,错误是eventsDidChange您错过调用的this.eventJSON()观察员功能didRender

Option2.您希望在模型数据发生变化时再次绘制日历,因为您可以使用getnewEvent方法进行渲染。你完全不需要观察者。

注意:

1.不要期望get计算属性将被调用,只有在您请求thourgh this.refresh(); this.transitionTo("events") 或模板时才会调用它。目前它看起来没有返回价值。记住计算属性​​总是应该返回值。但这与你的问题无关。

2.In events / index.js,

cal-event

上面两个都会做同样的事情,我认为在你的情况下你不需要调用这两个方法,因为你的模型钩子正在使用findAll所以它将返回实时记录数组,因此它将自动更新。由于您的{{1}}组件会调用rerendering methods