gpt4 book ai didi

ember.js - 在Ember中为ember-i18n动态渲染组件

转载 作者:行者123 更新时间:2023-12-02 06:07:29 25 4
gpt4 key购买 nike

首先,在这种情况下, Ember 的组件帮助程序无济于事。仅当我知道需要渲染多少组件以及按什么顺序渲染时,这才有帮助。

我需要能够基于如下字符串渲染组件:{{user}} has made a bid of {{bid}},其中:

  • {{user}}{{bid}}将替换为组件。
  • 给定的字符串是未知的,表示组件的动态节的数量未知(组件将与给定的字符串一起传递)。

  • 如果这些动态部分是帮助者,这将很容易-但是帮助者不会在我的游戏中的某些项目上削减它。

    理想情况下,我可以执行以下操作:
    {{translated-content
    content='{{user}} has made a bid of {{bid}}'
    user=(component 'user-ui')
    bid=(component 'bid-ui') }}

    炭烬有可能吗?

    最佳答案

    在一些帮助下,我提出了可与ember-i18n和ember 1.11或更高版本一起使用的以下组件。

    可能会对其进行进一步优化,但是它的运行方式既好又快速。

    创建一个新组件
    ember g component t-t
    template.hbs

    {{#each parts as |part|}}

    {{#if part.isComponent}}
    {{component part.content}}
    {{else}}
    {{part.content}}
    {{/if}}

    {{/each}}

    component.js
    import Ember from 'ember';
    const { $ } = Ember;

    export default Ember.Component.extend({

    tagName: 'span',

    updateComponents: Ember.on('didReceiveAttrs',function(opts){

    let newAttrs = opts.newAttrs;
    let components = {};

    $.each(newAttrs,(key,val)=>{

    if( key !== 't' && typeof val === 'object' ){
    let keys = Object.keys(val);
    if(keys.length && keys[0].indexOf('COMPONENT_')>=0){
    components[key] = val;
    }
    }

    });

    this.set('_components',components);

    }),

    parts: Ember.computed('_components','t','i18n.locale',function(){

    let attrs = [];
    let components = this.get('_components');
    let componentKeys = Object.keys(components);

    $.each(this.attrs,(key,val)=>{
    if( key !== 't'){
    if( componentKeys.indexOf(key)<0 ){
    attrs[key] = val;
    } else {
    attrs[key] = `{{${key}}}`;
    }
    }
    });

    let content = this.get('i18n').t(this.get('t'),attrs).toString();
    content = content.replace(/\{\{(\w+?)\}\}/g,(fullMatch)=>{
    return `{{split}}${fullMatch}{{split}}`;
    });

    let parts = content.split('{{split}}');

    parts.forEach((val,i)=>{
    let isComponent;
    let key = val.replace(/\{\{(\w+?)\}\}/g,(fullMatch,key)=>{
    isComponent = true;
    return key;
    });

    if(isComponent && components[key]){
    parts[i] = {
    isComponent: true,
    content: components[key]
    };
    } else {
    parts[i] = {
    content: Ember.String.htmlSafe(val)
    };
    }

    });

    return parts;

    }),

    }).reopenClass({
    positionalParams: ['t']
    });

    用法
    {{t-t
    'your-ember-i18n-path'
    key1='Normal Content (example)'
    key2=(component 'your-component') }}

    关于ember.js - 在Ember中为ember-i18n动态渲染组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36757884/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com