jquery - 如何监听操作中的点击 - emberjs 最佳实践

标签 jquery ember.js ember-cli

我最近开始学习 emberjs,并且正在努力了解不同组件如何相互交互,以及做事的最佳实践。

我想要做的是使用 ember 提供的类绑定(bind)来重现以下粗略的 jquery 功能:

import Ember from "ember";

export default Ember.Component.extend({
    actions: {
        showMenu: function() {
            $('.menu-bar').removeClass('hideMenu');
            $('.menu-bar').addClass('showMenu');

        $('.page').click(function() {
            $('.menu-bar').removeClass('showMenu');
            $('.menu-bar').addClass('hideMenu');
        });
    }
}
});

到目前为止我所做的是:

import Ember from "ember";

export default Ember.Component.extend({
    showMenu: false,
    actions: {
        showMenu: function() {
            this.set('showMenu', true);
        }
    }
});

我的菜单栏组件如下所示:

<div {{bind-attr class=":menu-bar showMenu:menuSlideDown:menuSlideUp"}} {{action 'showMenu'}}>
</div>

最后我的模板被加载到 {{outlet}} 中,如下所示:

<div {{bind-attr class=":page :home :current"}}>
    {{menu-bar}}
    <div class="splash center button-perspective">
    </div>
</div>

我想知道所需功能的“最佳实践”。另请注意,我正在使用 ember-cli。

我可以在元素“page”上添加一个 {{action}} 监听器,但我有多个带有“page”类的模板,因此必须将此监听器添加到所有页面 - 这也意味着它将触发每个单击时间页面对我来说感觉很脏。我想处理属于菜单栏 Controller 内的 menu-bar.js 组件的所有操作。这是合理的逻辑吗?如果是\否,最好的方法是什么?

如果需要更多信息,我很乐意提供 - 也欢迎任何和所有批评。

最佳答案

这可以是实现该功能的示例

//In any view template, consider custom-form as a component
{{custom-form dataSet=model.data action='submitForm'}}

//In custom-form.hbs
<div class="container">
    <div class="header">
    <span>Form</span>   
    {{#if isExpanded}}
        <span class="arrow"{{action "toggleExpanded"}}><i class="glyphicon glyphicon-triangle-bottom"></i></span>
    {{else}}
        <span class="arrow" {{action "toggleExpanded"}}><i class="glyphicon glyphicon-triangle-top"></i></span>
    {{/if}} 
    </div>  
    {{#if isExpanded}}
        {{#each qObj in dataSet}}
        <div class="form-group">
            <label>{{qObj.question}}</label>
            {{input value=qObj}}
        </div>
        {{/each}}
    {{/if}}
    <button {{action 'submitForm'}}>Submit</button>
</div>

//In custom-form.js
import Ember from 'ember';
import layout from '../templates/components/custom-form';

export default Ember.Component.extend({
  layout: layout,
  isExpanded:true,
  actions:{
    submitForm:function(){
        this.sendAction(); //This will send action to outside application
    },
    toggleExpanded:function(){
        this.toggleProperty('isExpanded');
    }
  }
});


//In any controller which is the context of component
import Ember from 'ember';

export default Ember.Controller.extend({
    actions:{
        submitForm:function(){
            alert('From Controller');
            console.log(JSON.stringify(this.get('model.data')));
        }
    }
});

现在这里定义了action='submitForm',如果您想在组件操作的基础上处理某些特定功能,则该方法名称可以是您将在 Controller 中实现的任何名称。 组件的正常操作将仅在组件内部处理,例如 'toggleExpanded''submitForm' 。现在要将操作从组件发送到应用程序,请使用 sendAction 方法。

现在与组件相关的文件将仅位于 templates/componets/.hbs 和 Components/.js

关于jquery - 如何监听操作中的点击 - emberjs 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29063934/

相关文章:

javascript - 如何在单元测试中将商店注入(inject) Ember.Service?

ember.js - ember cli 中文件上传的验收测试

jQuery tokeninput 跨多个字段搜索

javascript - 基于 scroll(function()) 应用 CSS

javascript - Ember 处理多次返回吗?

ember.js - 从我的 Ember 模型中返回 1 个对象/记录

javascript - Highcharts - 如何在 3D 散点图上的点工具提示(弹出窗口)中设置自定义内容或如何自定义点工具提示信息?

javascript - 如何链接 .call() 函数 - 将过渡添加到 Nivo Lightbox

javascript - 具有 hasMany 关系的模型上的 Ember.js 单元测试计算属性会产生 TypeError

ember.js - 将 JSON 对象转换为 Ember 数据模型