【问题标题】:Reinitalize item-controller after route transition路由转换后重新初始化项目控制器
【发布时间】:2015-03-22 13:06:23
【问题描述】:

我正在尝试构建一系列复选框来检查星期几,但我不知道如何在切换路线时保持正确的演示状态。

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

设置如下(coffeescript notation):

这样定义的数组控制器:

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

【问题讨论】:

    标签: javascript ember.js coffeescript


    【解决方案1】:

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

    查看 Route 上的 resetController 方法。

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

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

    【讨论】:

      【解决方案2】:

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

      更新的 JsBin:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-25
        • 2010-10-24
        • 1970-01-01
        • 2020-07-16
        • 2020-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多