Emberjs 1.0,计算性能和模板没有更新数据更改时(Emberjs 1.0, Computed

2019-10-18 19:03发布

我有一个emberjs应用与集成日期选择器。 当我点击日期选择日期,计算性能应该比较点击日期与*时隙的日期**,看看是否有比赛,我希望基于该模板刷新,无论是列出可用的时隙或者说没有。 不幸的是,模板不刷新或呈现新的数据。

这是的jsfiddle ,重要的控制器/路由/模板是时隙约会日期选择器和datepickerComponenet。

在的jsfiddle,您需要点击查看更多和向下滚动,看到加载的日历和具有时隙中红色的日期。 问题是,点击在红色的任何日期应该重新呈现时隙模板,并重新计算,将计算displaySelectedDate财产。 现在,它只是呈现时隙模板 ,你第一次点击日期,该模板未在随后的每次点击刷新后。

这是控制器。 它也似乎在计算财产不被调用一次以上。 其结果是,以前,我叫.volatiledisplaySelectedDate计算的财产 ,但并没有改变,所以我删除,并添加此处显示的观察者 ,但仍然没有改变。

App.TimeSlotController = Ember.ArrayController.extend({
  needs: 'appointment',
  content: [ ],

 apptId: null,
 apptDate: null,
 day: Ember.A([ ]),

 contentDidChange: function(){
   a = this.get('day'); 
     console.log(a);
   return a;
  }.observes('day'),

  displaySelectedDate: function(){
    a = moment(this.get('apptDate')).unix();

    b = moment.utc(this.get('day').toString()).unix(); 

    x = (a === b);

    return x;

  }.property('day.@each', 'apptDate'),                                                 

});

从我填充时隙先取出约会路线

App.TimeSlotRoute = Ember.Route.extend({

   setupController: function(controller, model) {

     self = this;
     self._super(controller, model);

     parent = self.controllerFor('appointment');

     self.controller = controller;

    c =   parent.get('timeSlots').then(function(data){
        f =  self.controller.set('content', data); 

     });          
   }
 })

在日期选择器控制器,提供了将在日期选择器着色日期排列。 如果我们使用的dateArray计算财产的注释去掉了版本获取预约的startDate预期日期是彩色的。 但是,如果评论的第一个版本,并取消由开始时间获取时隙 calebdar dateArray计算性能的第二个版本不着色。 任何想法,为什么会这样

  App.DatePickerController =  Ember.ArrayController.extend({ 
     needs: ['appointments', 'appointment', 'timeSlot'],

   time: Ember.computed.alias('controllers.timeSlot.content'),
   appointments: Ember.computed.alias('controllers.appointments.content'),

   dateArray: function(){
     _this = this;  
     var fetchDates = _this.get('appointments');

     return  fetchDates.map(function(item){ 
       return moment.utc(item.get('startDate')).format("YYYY-MM-DD");
     });
   }.property('appointments.@each.startDate'),

   /*
   dateArray: function(){
     _this = this;  
     var fetchDates = _this.get('time');

     return  fetchDates.map(function(item){ 
      return moment.utc(item.get('startTime')).format("YYYY-MM-DD");
     });

    }.property('timeSlot.@each.startTime'),  
   */
 });

这是thesame代码的缩小版,我创建了一个第二的jsfiddle 。 在这个版本的日期选择器控制和路由被删除,它有代码,被转移到了预约控制器。 如果你点击它,你会看到,与预约的时隙不是红色,它应该得到的颜色。

  App.AppointmentController = Ember.ObjectController.extend({

    dateArray: function(){
       _this = this;  

       fetchDates = [ ];

       var aa = _this.get('content'); 

       var yy = aa.get('timeSlots');

        yy.then(function(hh){

          nn = hh.map(function(item){ return moment.utc(item.get('startTime')).format("YYYY-MM-DD");
         });

     pp =  fetchDates.pushObjects([nn]);

     return nn;
   });       

    return fetchDates;
 }.property('content.@each.timeSlots')

});

这样做控制台日志建议的dateArray在约会控制器返回形式的数组:

  [Array[2]]

但阵列使用dateArray计算属性 ,颜色预约的startDate日历,是形式的第一个版本时,由datepickerController返回:

  ["2013-10-18", "2013-10-25", "2013-10-25", "2013-10-18"]

我想要的是

是做了非常对的DatePicker日期点击重新呈现时隙模板,其次对我来说,能够使用任何任命控制器dateArray计算财产日期选择器CONTROLER第二个版本加载时隙开始时间的日历。

这是任命的startDate的屏幕截图上的日历支持算法FMP第一的jsfiddle

这是截图,当我尝试时隙开始时间传递给基础上无论是2号的jsfiddle,或在第一个的jsfiddle的日期选择器控制器注释掉dateAarray财产的日历。 注意日历停留在这两种情况下无色

谢谢你的帮助。

Answer 1:

有一个异步的问题,因为时隙被定义为异步。 您可以在路由afeterModel钩解决这个问题。 如果这个钩子(也beforeModel和型号挂钩)返回一个承诺路由器停止,直到承诺解决......这是新的会面路线:

App.AppointmentRoute = Ember.Route.extend({
    model: function(params){
      return modelFor('appointments').get(params.appointment_id);  
    },
    afterModel:function(model){
        return model.get('timeSlots');
    }
});

和的jsfiddle http://jsfiddle.net/Xajsr/10/



文章来源: Emberjs 1.0, Computed property and template not refreshed when data changes