繁体   English   中英

将数据从应用程序控制器传递到子控制器

[英]Pass data from application controller to child controller

我使用的是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) ,但结果相同

没有完整的代码示例很难确定,但是看起来您的问题可能是使用push而不是pushObject 后者将触发观察者和依赖关系 ,这将导致您的模板重新呈现。

您可能还需要研究ember-wormhole,作为一种将模式对话框呈现到顶级应用程序模板中的方法,而不必从应用程序控制器中进行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM