【问题标题】:Dynamically add input field to Ember template/route/view, update model with data动态添加输入字段到 Ember 模板/路由/视图,用数据更新模型
【发布时间】:2016-02-05 03:15:40
【问题描述】:

我对 Ember 非常陌生,并且对动态元素有疑问。 我想知道如何通过单击按钮将输入字段动态添加到我的 ember 模板/模型中。然后让该信息能够在模型上更新。

如果它是静态的,我知道如何处理。我熟悉使用动作事件更新控制器并编写函数来处理它们。我之前没有修改过某个操作的视图。

欢迎使用逻辑和关键字,我不需要确切的代码,但它会有所帮助。

谢谢!

【问题讨论】:

    标签: javascript forms ember.js handlebars.js


    【解决方案1】:

    OOOOOOOOOOK 经过数小时的失败后,我终于得到了我需要的东西,了解 ember 弃用很有帮助哈。但是,我不确定这是否是最好/正确的处理方式。有人可以告诉我是否有更好的选择。

    这样做的功能是:点击保存输入中的数据,然后添加另一个输入,同时仍显示先前的数据。

    我有一个模型,其中包含一个临时值和一个数组。

    App.ApplicationRoute = Ember.Route.extend({
    model:function(){
        return {singleVal:'',images:[]}
    }
    })
    

    我有一个模板,它显示一个空白输入,其值始终指向模型临时值。它还循环 model.images 并显示任何数据(如果有)。由于它是用 #each 编写的,因此它会在模型​​更改时更新:)

     {{#each model.images as |info|}}
      <label>image:</label>
      {{input value=info}}<br/>
    {{/each}}
    
    image {{input value=model.singleVal}}<br/><br/>
    <button {{action "addField"}}>ADD INPUT FIELD</button>
    

    控制器监听点击。然后只需将 temp 值添加到模型中的图像数组中。然后它会清除临时变量,因此它不会在重新渲染时显示。

    App.ApplicationController = Ember.Controller.extend({
    actions:{
        addField:function(){
            console.log(this.model.singleVal);
            this.model['images'].addObject(this.model.singleVal);
            this.set('model.singleVal','')
        }
      }
    })
    

    【讨论】:

    • FWIW 最好用这个打开另一个问题 - 或者 - 编辑您的原始问题。
    • 我不确定您收到了什么警告,但这是您使用 ember 2.2.0 和 ember 语法的代码版本(注意使用 get()set()):@ 987654321@
    • 嘿@patrickberkeley 感谢您像这样在 ember-twiddle 上设置我的项目!我看到并喜欢 get() 和 set() 的使用。我实际上考虑过在控制器中设置该值,因为它是临时的,但是我不确定如何在控制器中获取该值。会是 {{input value=controller.myVariable}} 之类的吗?
    • 只需{{input value=myVariable}}。控制器上设置的属性直接在控制器模板中可用。我已经更新了旋转(哈哈旋转是一个有趣的词:)。
    • 很高兴为您提供帮助。请投票任何有用的东西;-)
    【解决方案2】:

    这里概述了如何执行您所描述的操作:

    model.js

    import DS from 'ember-data';
    
    const {
      attr
    } = DS;
    
    export default DS.Model.extend({
      someProperty: attr('string')
    });
    

    template.hbs

    <button {{action 'toggleInput'}}>
      Toggle that input!
    </button>
    
    {{#if isVisible}}
      {{input
        value=model.someProperty
      }}
    {{/if}}
    

    controller.js

    import Ember from 'ember';
    
    export default Ember.Controller.extend({
      isVisible: false,
    
      actions: {
        toggleInput() {
          this.toggleProperty('isVisible');
        }
      }
    });
    

    还有一个 ember-twiddle 演示:https://ember-twiddle.com/3901bf2bf11c65cff1b5?numColumns=1&openFiles=application.route.js%2C

    【讨论】:

    • 这不只是隐藏了现有的输入吗?我认为问题是关于在按钮单击时添加新输入。我想这就是他正在寻找的stackoverflow.com/a/17926116/548568
    • 感谢 patrickberkeley 的快速回复,但我希望能够像 @blessenm 建议的那样动态添加多个字段。虽然该示例是使用 Ember 1.0.0 并且我试图在 2+ 中执行此操作,但该语法仍然有效吗?
    • 是的,它应该适用于 2.x。我使用 1.x 的唯一原因是因为我想使用现在已弃用的固定装置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多