2014-05-21 94 views
1

我正在致力於habit tracking app。我從一系列習慣開始。當用戶點擊一個習慣時,它會爲該習慣創建一個新事件。我有名單工作,但我在創建新事件方面遇到困難。如何從Ember控制器訪問查詢參數

要創建一個新的事件,我有這樣的路線:

App.Router.map(function() { 
    ⋮ 
    this.resource('new_event', { path: '/event/new/:habit_id' }) 
}) 

那麼相關的路由器是:

App.NewEventRoute = Ember.Route.extend({ 
    model: function(params) { 
    return this.store.find('habit', params.habit_id) 
    }, 
    setupController: function(controller, model) { 
    controller.set('selectedHabit', model) 
    } 
}) 

據我所知,我可以訪問該查詢的唯一的地方參數在模型函數內。

的控制器,那麼,是:

App.NewEventController = Ember.ObjectController.extend({ 
    init: function() { 
    console.log('init', this.get('selectedHabit')) 
    // Logic for adding a new event for the habit 
    this.transitionToRoute('events') 
    }, 
    selectedHabit: null, 
    ⋮ 

selectedHabit返回的值是null

+0

是params.habit_id返回你期待什麼? – bmeyers

+0

是的。網址的末尾正確解析爲id。 – Will

回答

0

這是answered on the Ember discussion board。如果不使用航線,我結束了一個動作去:

<script type="text/x-handlebars" id="habits"> 
    <div id="habits"> 
    {{#each}} 
     <div class="row" {{action 'createEvent' id}}> 
     <div class="col-xs-1 color" {{bind-attr style=style}}></div> 
     <div class="col-xs-8">{{name}}</div> 
     <div class="col-xs-3" data-role="timer">{{format-time-numeric lastTime}}</div> 
     </div> 
    {{/each}} 
    </div> 
</script> 

腳本

App.HabitsRoute = Ember.Route.extend({ 
    actions: { 
    createEvent: function(habitId) { 
     var self = this 
     var store = this.get('store') 
     store.find('habit', habitId).then(function(habit) { 
     store 
      .createRecord('event', { 
      habit: habit, 
      time: new Date() 
      }) 
      .save().then(function(event) { 
      habit.get('events').then(function(events) { 
       if(! events) { 
       events = [] 
       habit.set('events', events) 
       } 
       events.pushObject(event) 
       habit.save().then(function() { 
       self.transitionTo('events') 
       }) 
      }) 
      }) 
     }) 
    } 
    } 
}) 
0

這實際上是有意義的,因爲當調用setupController時,控制器作爲參數傳遞,因此已經被初始化(例如http://emberjs.jsbin.com/cuwadafu/1/edit)。這意味着init函數已被調用並且selectedHabit屬性尚未設置。

一個解決方案可能是創建一個通用函數來創建事件(這也可以從其他地方以及)與所有的邏輯,觀察selectedHabit屬性。

App.NewEventController = Ember.ObjectController.extend({ 
/*passing an optional parameter of habitId, to make this generic, could be an option*/ 
    addNewEvent:function(/*habitId*/){ 
    // Logic for adding a new event for the habit 
    this.transitionToRoute('events') 
    }.observes("selectedHabit"), 
    . 
    . 
}); 
相關問題