首页 文章

Emberjs-1.0将控制器实例传递给ember组件

提问于
浏览
1

我创建了一个 DatePickerComponent ,我传入两个控制器实例,如下所示:

<script type="text/x-handlebars" data-template-name="appointment">
  {{date-picker datePickerController=datePickerController  timeSlotController=timeSlotController}}

从内部 component 我可以获取 datePickerController 但是当我尝试获取 timeSlotController 时,它总是返回undefined . 它们都是相同的,并以同样的方式传递,所以为什么一个未定义而另一个可用 . 控制器和组件以及路由器都粘贴在这里 .

App.DatePickerComponent = Ember.Component.extend({
  datePickerController: null,
  timeSlotController: null,

  didInsertElement: function() {
   this._super();
   _this = this;
   var datePicker, timeSlot;
   timeslot = _this.get('timeSlotController');
   datePicker = _this.get('datePickerController');

   alert(timeSlot);
   alert(datePicker);
  }
});

我将 DatePickerComponent 添加到下面的 appointment template 中 .

<script type="text/x-handlebars" data-template-name="appointment">
   {{date-picker datePickerController=datePickerController  timeSlotController=timeSlotController}}

  <p class="first">   from appointment template</p> 
   {{datePickerController}}
   
<p class="second"> from appointment template</p> {{timeSlotController}}
</script>

奇怪的是,当约会模板根据上面的内容呈现时,它显示 timeSlotController 实例已被传递,因此它看到:

<App.TimeSlotController:ember319>

<App.DatePickerController:ember313>

但我在组件 alert(timeSlot)alert(datePicker) 添加了2个警报

alert(timeSlot);   gives undefined
  alert(datePicker);  returns **<App.DatePickerController:ember313> **

所以** alert(datePicker)**返回模板中显示的同名实例 .

任命控制员

App.AppointmentController = Ember.ObjectController.extend({
  needs: ['datePicker', 'timeSlot'],
  datePickerController:   Ember.computed.alias('controllers.datePicker'),
  timeSlotController: Ember.computed.alias('controllers.timeSlot')

});

时隙控制器

App.TimeSlotController = Ember.ArrayController.extend({
   content: [ ],
   //content: Ember.computed.alias('day'),
   contentBinding: 'day',
   day: ''   
 });

日期选择器控制器

App.DatePickerController =  Ember.ArrayController.extend({ 
   needs: ['appointments', 'appointment'],
   //apptId: '', 
  appointments: Ember.computed.alias('controllers.appointments.content'),
  apptId:  Ember.computed.alias('controllers.appointment.content')
 });

路由器

App.Router.map(function(){
    this.resource('appointments', {path: "/"}, function(){ 
      this.resource('appointment', {path: "/:appointment_id"}, function(){
         this.resource('timeSlot', {path: '/:day'});                     
      });     
    }); 
  });

1 回答

  • 1

    你在组件的代码中有一个拼写错误,didInsertElement应该是 timeSlot = _this.get('timeSlotController'); ,其中S大写

    didInsertElement: function() {
      this._super();
      _this = this;
      var datePicker, timeSlot;
      //timeslot = _this.get('timeSlotController');
      timeSlot = _this.get('timeSlotController');
      datePicker = _this.get('datePickerController');
    
      alert(timeSlot);
      alert(datePicker);
    }
    

    http://jsfiddle.net/FUdgY/1/

相关问题