【问题标题】:Re render a component from another component Ember从另一个组件 Ember 重新渲染一个组件
【发布时间】:2019-04-19 15:21:09
【问题描述】:

我正在尝试在单击另一个 component 时重新渲染特定的 component。当用户单击特定的button component 时,sessionStorage 中的一个变量会发生变化,另一个component 使用该变量来显示数据。单击后,我希望该特定组件重新呈现自身。我见过Ember Re-render componentEmber Rerendering component within component,但它们似乎不适用于我的情况。这是我的文件:

模板/组件/按钮/button-cancel.hbs

{{#each-in metaData as |module definition|}}
  {{#if (eq definition.name "cancel_button") }}
  <button class={{definition.css_class}} {{action "changeToAccounts"}}> Accounts </button>
  {{/if}}
{{/each-in}}
{{yield}}

components/buttons/button-cancel.js

import Component from '@ember/component';
import MD from "../../utils/metadata";

export default Component.extend({
  init: function() {
    this._super(...arguments);
    this.metaData = MD.create().getMetaViewStuff("Leads", "record", "buttons");
    //    console.log(this.metaData);
  },
  actions: {
    changeToAccounts: function() {
      sessionStorage.setItem('module', "Accounts");
    }
  }

});

模板/组件/面板/list-panel.hbs

{{buttons/button-save}} <!--This button is same as button-cancel-->
{{buttons/button-cancel}}
{{field-list-headers}}
{{yield}}

components/field-list-headers(需要重新渲染的组件)

import Component from '@ember/component';
import MD from "../utils/metadata"

export default Component.extend({
  init: function(){
    this._super(...arguments);
    this.metaData = MD.create().getMetaViewStuff(sessionStorage.getItem('module'), "list", "panels")
  }
});

函数 getMetaViewStuff

  getMetaViewStuff: function(module, submodule, item, i18n) {
    if (this.modules[module]["views"][submodule]["meta"] !== undefined && this.modules[module]["views"][submodule]["meta"][item] !== undefined) {
      let meta = this.modules[module]["views"][submodule]["meta"][item];
      return meta;
    }
    return false;
  }

【问题讨论】:

    标签: javascript ember.js


    【解决方案1】:

    我的建议是通过服务共享相同的属性,并使用该服务更新本地存储并缓存所述服务上的值。我提供了一个example,它使用服务在两个组件之间共享一个值(我不能在旋转中使用本地存储)。

    假设我们想要将编程语言列表显示为表格或有序列表。我们有两个组件,用于切换模式的可重复使用的mode-changer 按钮和用于实际呈现列表的programming-languages 组件,它们都与共享的mode-service 交互。:

    export default Ember.Service.extend({
      init(){
        this._super(...arguments);
        //actually read from local storage here and set default on null
        this.set('mode', 'list');
      },
      toggleMode(){
        let newValue = this.get('mode') === 'list' ? 'table' : 'list';
        //actually store to local storage here before caching on the service
        this.set('mode', newValue);  
      }
    });
    

    想象一下这个模板显示了两个组件:

    {{programming-languages languages=languages}}
    {{mode-changer}}
    

    mode-changer 注入mode-service,通过mode-service 导出逻辑按钮文本并通过toggleMode 切换mode-servicemode 属性:

    export default Ember.Component.extend({
      modeService: inject(),
      buttonText: computed('modeService.mode', function(){
        let mode = this.get('modeService.mode');
        return mode === 'list' ? "Change to table" : "Change to list";
      }),
      actions: {
        toggleMode(){
          let modeService = this.get('modeService');
          modeService.toggleMode();
        }
      }
    });
    

    mode-changer 的组件:

    <button onclick={{action 'toggleMode'}}>{{buttonText}}</button>
    

    programming-languages 组件通过计算属性将其渲染模式基于modeService.mode

    export default Ember.Component.extend({
      modeService: inject(),
      renderList: computed('modeService.mode', function(){
        let mode = this.get('modeService.mode');
        return mode === 'list';
      })
    });
    

    因此对modeService.mode 的更改将导致计算属性无效并触发组件的渲染。

    {{#if renderList}}
        <ol>
      {{#each languages as |language|}}
        <li>{{language}}</li>
      {{/each}}
      </ol>
    {{else}}
      <table>
        <th>Language</th>
          {{#each languages as |language|}}
          <tr>{{language}}</tr>
        {{/each}}
      </table>
    {{/if}}
    

    在 Ember 中,服务是单例的,因此这种共享在许多情况下是合适的。对我来说,这比任何其他实际存储/检索对组件本身的引用并调用其渲染函数的解决方案要好得多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-17
      • 2020-08-09
      • 2019-07-03
      • 2021-03-16
      • 1970-01-01
      • 2018-12-12
      • 2021-12-04
      • 1970-01-01
      相关资源
      最近更新 更多