路由转换后初始化项目控制器

时间:2015-03-22 13:06:23

标签: javascript ember.js coffeescript

我正在尝试构建一系列复选框以检查一周中的几天,但我无法弄清楚如何在切换路线时保持正确的演示状态。

由于它保持了以前的状态(控制器是单例),我无法弄清楚每次转换时重新初始化它的最佳方法,以及当我尝试创建新的事件实例时。

设置如下(coffeescript表示法):

如此定义的数组控制器:

ProjectEventsController = Ember.ArrayController.extend
  itemController: 'project/event'

项目控制器包含监视复选框

的观察者
ProjectEventController = Ember.ObjectController.extend

  mon:true
  tue:true
  wed:true
  thu:true
  fri:true
  sat:true
  sun:true

  _days: []

  eventId: undefined

  eventObserver: (()->

    if !@get('eventId')
      @set 'eventId', @get('event.id')
      @set '_days', @defaultDays

      # if we have a recurrence days, we check the days that are already checked
      # else we check them all
      if @get('event.recurrence') and @get('event.recurrence.days')
        console.log 'existing recurrence', @get('event.recurrence.days')
        (@defaultDays.filter (day)=>
          !@get('event.recurrence.days').contains day
        ).forEach (uncheckedDay)=>
          console.log 'uncheckedDay', uncheckedDay
          @set uncheckedDay.toLowerCase(), false

    if (@get('event.recurrence') and @get('event.recurrence.days') == @defaultDays)
      console.log 'all days checked', @get('event.recurrence.days'), @defaultDays
      @set 'recurrenceEnabled', false
  ).observes('event.id')


  _daysObserver: ((k,v)->
    val = @get v
    key = v.toUpperCase()
    days = @get '_days'
    if val
      if !days.contains key
        days.push key
    else
      days = days.filter (item)->
       item != key

    @set '_days', days
    if @get 'event.recurrence'
      @set 'event.recurrence.days', days.toArray()
    else
      @set 'event.recurrence', Ember.Object.create
        type: 'weekly'
        days: days
        start_hhmm: @defaultHHmm
        duration_seconds: @defaultDuration
  ).observes('mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun')

复选框很简单:

<div>{{input checked=thu type="checkbox" disabled=recurrenceNotEnabled }} Thu</div>

此代码的JsBin位于:

http://emberjs.jsbin.com/boweze/2/edit

2 个答案:

答案 0 :(得分:0)

听起来您想在路线转换时重置属性。

检查Route上的resetController方法。

http://emberjs.com/api/classes/Ember.Route.html#method_resetController

然后,您可以从resetController方法内部将控制器的EventId属性重置为undefined。看起来它会做你需要的。

答案 1 :(得分:0)

你可以使用.on('init')和观察者来启动初始化代码。

更新了JsBin:

http://emberjs.jsbin.com/boweze/4/edit