2016-05-07 49 views
0

我使用Ember 1.13,我認爲這在2.x中已被棄用/更改,但該項目不會升級。將數據從應用程序控制器傳遞到子控制器

也許我不會以正確的方式去解決這個問題,或者錯過簡單的東西。無論哪種方式,我需要做的是在模式中添加一種新飲料,然後用新飲料(作爲表中的一行)更新菜單數據。

我有一個父級管理員控制器(admin.menu)內的菜單控制器。我有一個模式,我添加數據,模態似乎需要在應用程序控制器之外的任何插座,否則它不會正確呈現。所以,我在應用程序控制器中添加了新的飲料。

// controllers/application.js 
export default Ember.Controller.extend({ 
    menuController: Ember.inject.controller('admin.menu'), 

    ... 

    actions: { 
    submitCustomDrink: function(){ 
     // action to create a new custom drink item 
     let element = document.getElementById("custom-drink-name"); 
     let drinkType = element.value; 

     Ember.$.ajax({ 
     'url': `${Config.apiRoot}store-drinks/custom/`, 
     'method': 'POST', 
     'data': { 
      drink_name: drinkType 
     } 
     }).then(data => { 
     // Add new drink to the existing drinks list 
     let drinkArray = this.get("menuController.drinkArray"); 
     let drinkObject = { 
      "drinkType": drinkType, 
      "drinkSet": data 
     }; 

     drinkArray.push(drinkObject); 

     data.forEach(drink => { 
      this.store.push('store-drink', drink); 
      console.log(`pushed ${drink.type} of ${drink.size} into store`); 
     }); 

     // reset modal input 
     element.value = ""; 
     }, function(err){ 
     console.log('error', err); 
     }); 
    } 
    } 
}); 

在那個應用程序控制器中,我注入了使用我添加的數據的菜單控制器。

當我添加新飲料時,我期待templates/admin/menu.hbs中的表格有額外的一排。行由使用控制器中的drinkArray的組件生成。

<tbody> 
{{#each drinkArray as |drink|}} 
    {{joe-menu-row drinkSet=drink.drinkSet type=drink.drinkType detailDrink=detailDrink}} 
{{/each}} 
</tbody> 
  • 加載頁面時,此代碼的工作,得到所有的飲料和創建行。
  • 添加新飲料並重新加載頁面後,新飲料出現,但我需要顯示它,而無需重新加載頁面。
  • 通過在應用程序控制器控制檯日誌,我看到this.get("menuController.drinkArray")返回的飲料名單,以及運行drinkArray.push(drinkObject)
  • 新的飲料對象後返回新的飲料作爲它的一部分也正在推進店正確,根據燼檢查
  • 我想,也許它的更新本地變量,而不是在菜單控制的財產,所以我也嘗試過類似this.get("menuController").set('drinkArray', drinkArray),但具有相同的結果

回答

0

很難肯定地說沒有一個完整的代碼示例,但它看起來像你的問題可能是使用push而不是pushObject。後者will trigger observers and dependencies,這將導致您的模板重新渲染。

您可能還希望查看ember-wormhole作爲將模態對話框渲染到頂層應用程序模板的方式,而無需從應用程序控制器執行此操作。

+0

pushObject做了詭計,並感謝蟲洞暗示 – awwester

+0

嗯實際上有一點問題。行被添加,但飲料不會保存。說'drink.save()'不是一個函數。調試'drink',新添加的飲料是一個對象,但其他單元格是 – awwester

+0

通過首先推送來存儲,然後從商店獲取這些對象(在我使用API​​原始數據之前,而不是來自商店的對象)。謝謝! – awwester

相關問題