簡體   English   中英

EmberJS:如何從控制器的動作轉換到路由器

[英]EmberJS: How to transition to a router from a controller's action

我有一個動作:

{{action create target="controller"}}

我已將其定位到綁定控制器(而不是路由器),如下所示:

App.AddBoardController = Ember.Controller.extend
    create: ->
        App.store.createRecord App.Board, {title: @get "boardName"}
        App.store.commit()
        //TODO: Redirect to route

如何從控制器操作重定向回路由?

事實上,這不是Ember慣用語。 據我所知,以及我從Tom Dale自己學到的東西,這里有一些關於該代碼的評論:

  • 首先,你不應該從路由器內部轉移到其他地方:通過這樣做,你會暴露自己的嚴重問題,因為你不知道路由器在哪個狀態,所以為了保持運行,你很快就會降低你的設計,順便提一下代碼的整體質量,最后是應用程序的穩定性,
  • 其次,您顯示的操作內容應位於路由器內部,以避免意外的上下文執行。 路由器確實是一種強制整個應用程序連貫行為的方法,只在某些狀態下處理操作。 當您將動作實現放入控制器時,可以隨時調用這些動作,包括任何錯誤...
  • 最后,Ember的控制器並不旨在包含行為,因為它們更像是增值包裝器,主要包含計算屬性。 如果你想要對基元進行因子分解,那么模型可能是一個好地方,或者是第三方環境,但肯定不是控制器。

你應該把動作放在路由器里面,並相應地轉換。

希望這會有所幫助。

UPDATE

第一個例子(靠近你的樣本)

在適當的路線:

saveAndReturnSomewhere: function (router, event) {
  var store = router.get('store'),
      boardName = event.context; // you pass the (data|data container) here. In the view: {{action saveAndReturnSomewhere context="..."}}
  store.createRecord(App.Board, {
    title: boardName
  });
  store.commit();
  router.transitionTo('somewhere');
}

重構的例子

我建議你有以下路線:

  • show :顯示現有項目,
  • edit :建議輸入項目的字段

進入封閉路徑,跟隨事件處理程序:

  • createItem :創建一個新記錄並轉換edit路徑,例如
  • editItem :transitionTo edit路線

進入edit路徑,跟隨事件處理程序:

  • saveItem :將提交store和transitionTo show路由,例如

使用transitionToRoute('route')在Ember控制器操作中重定向:

App.AddBoardController = Ember.Controller.extend({
    create: function(){ 
        ...
        //TODO: Redirect to route
        this.transitionToRoute('route_name');
    }
...

編輯:繼續閱讀,邁克的答案討論了這種方法的一些問題。

您可以直接在路由器上調用transitionTo。 如果您使用默認值,則看起來像App.router.transitionTo('route', context)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM