在路线转换后重新初始化物料控制器

Reinitalize item-controller after route transition

本文关键字:初始化 控制器 转换 在路      更新时间:2023-09-26

我试图建立一系列复选框来检查一周中的哪几天,但我不知道如何在切换路由时保持正确的呈现状态。

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

设置如下(咖啡脚本符号):

一种定义如下的阵列控制器:

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

听起来你想在从路由转换时重置属性。

查看Route上的resetController方法。

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

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

您可以将.on('init')与观察程序一起使用,以便在初始化时激发代码。

更新JsBin:

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