Ember.js 将Ember 2操作发送到路由而不是组件

Ember.js 将Ember 2操作发送到路由而不是组件,ember.js,Ember.js,在我的应用程序中,我定义了以下组件: // components/buy-functions.js export default Ember.Mixin.create({ actions: { openModal: function() { $('#buyModal').openModal(); } } }); 然后在管线的模板中: <h5>Buy form</h5> {{#buy-function

在我的应用程序中,我定义了以下组件:

// components/buy-functions.js
export default Ember.Mixin.create({
    actions: {
        openModal: function() {
            $('#buyModal').openModal();
        }
    }
});
然后在管线的模板中:

<h5>Buy form</h5>
{{#buy-functions}}
    <div class="btn" {{action "openModal"}}>Buy</div>
{{/buy-functions}}
购买表单
{{{购买功能}
购买
{{/购买函数}
(该组件没有模板)

但是当我点击这个按钮时,我得到了一个错误:“OpenModel”操作没有得到任何处理。。。
有人能解释一下我做错了什么吗?

您需要将您的操作发送到route

 openModal: function(modalName) {
          this.sendAction('openModal',modalName);
            }
        }
把你的按钮换成

<div class="btn" {{action "openModal" 'myModal'}}>Buy</div>
但另一种方式是:

让我们将您的组件更改为

// components/buy-functions.js
export default Ember.Component.extend({
    actions: {
        openModal: function() {
            $('#buyModal').openModal();
        }
    }
});
然后创建组件模板

 // tempaltes/components/buy-functions.hbs
    <div class="btn" {{action "openModal"}}>Buy</div>

我在飞行中编写了这些代码。希望它对您有效。

您需要将操作发送到route

 openModal: function(modalName) {
          this.sendAction('openModal',modalName);
            }
        }
把你的按钮换成

<div class="btn" {{action "openModal" 'myModal'}}>Buy</div>
但另一种方式是:

让我们将您的组件更改为

// components/buy-functions.js
export default Ember.Component.extend({
    actions: {
        openModal: function() {
            $('#buyModal').openModal();
        }
    }
});
然后创建组件模板

 // tempaltes/components/buy-functions.hbs
    <div class="btn" {{action "openModal"}}>Buy</div>
我在运行中编写了这些代码。希望它对您有用。

有一个插件()为这个用例提供了一个助手(路由操作)

有一个.

有一个插件()为这个用例提供了一个助手(路由操作)


有一个。

确定,所以组件需要有一个模板才能使用它们自己的操作?是的,否则您需要将操作发送到route@CerealKiller没有模板的组件有点无用。@Lux我的应用程序中有很多没有模板的组件,它们更通用,因为你可以在组件和模板直接放在HTML中,这意味着您可以重用包含不同HTML的组件;这只是我第一次在操作中使用这样的组件,通常在没有模板的组件中,我只是使用didInsertElement钩子来激活一些javascript@CerealKiller这似乎是一个大的反模式to说实话!
didInsertElement
实际上主要是为了与遗留JS代码兼容。那么组件需要有一个模板才能使用它们自己的操作?是的,否则您需要将操作发送到route@CerealKiller一个没有模板的组件有点无用。@Lux我的应用程序中有很多没有模板的组件,they更通用,因为您可以根据组件中的js代码和直接在HTML中的模板来定义行为,这意味着您可以使用包含不同HTML的组件来重用该组件;这只是我第一次在操作中使用此类组件,通常在没有模板的组件中,我只使用didInsertElem耳鼻喉科钩激活一些javascript@CerealKiller老实说,这似乎是一个很大的反模式!
didInsertElement
实际上主要是为了与遗留JS代码兼容。