Ember.js:当使用{{action}}时,如何针对特定的控制器?
我在这里的代码示例中提出了我的问题: 请看,我可以使用Ember.js:当使用{{action}}时,如何针对特定的控制器?,ember.js,Ember.js,我在这里的代码示例中提出了我的问题: 请看,我可以使用{{action}}(位于子视图中)和target选项在ApplicationView或ApplicationController或ChildView中触发事件,但我真正想要的ChildController除外 根据文档,如果没有指定target,事件本身应该在相应的控制器中处理,在我的情况下,应该是ChildController。但为什么此操作总是在ApplicationController中查找?我是否错过了一些明显重要的内容?据我所知
{{action}}
(位于子视图中)和target
选项在ApplicationView
或ApplicationController
或ChildView
中触发事件,但我真正想要的ChildController
除外
根据文档,如果没有指定
target
,事件本身应该在相应的控制器中处理,在我的情况下,应该是ChildController
。但为什么此操作总是在ApplicationController
中查找?我是否错过了一些明显重要的内容?据我所知,view类不会更改当前控制器。由于您是从应用程序模板调用视图,因此它将保留在ApplicationController中
Emberjs.com渲染指南:
简单地将代码从视图更改为渲染调用似乎就可以做到这一点:
Trigger ApplicationController
</p>
{{render 'child'}}
触发器应用程序控制器
{{呈现“子”}
您可以使用调用不同控制器上的操作
App.ApplicationController = Ember.Controller.extend({
needs: ['child'],
doSomething: function() {
alert("From ApplicationController");
}
});
并且可以从模板中将目标指定为“controllers.child”
<p {{action doSomething target="controllers.child"}}>Blah blah</p>
这是你的工作小提琴
使用(“”)的
this.controller调用不同的控制器事件。下面给出了一个工作示例
JS:
//
var app=Ember.Application.create()
app.Router.map(函数(){
this.resource('post'))
});
app.ApplicationRoute=Ember.Route.extend({
模型:函数(){
返回{“firstName”:“amit”,“lastName”:“pandey”}
}
});
app.ApplicationController=Ember.ObjectController.extend({
地址:“93-B号房屋”,
全名:函数(){
返回this.get(“model.firstName”)+“”+this.get(“model.lastName”)
}.property(“model.firstName”、“model.lastName”),
行动:{
提交:功能(名称){
this.controllerFor('post').send('handleclick'))
},
makeMeUpper:函数()
{
警报(“调用应用程序控制器事件”);
this.set(“model.firstName”,this.get(“model.firstName”).toUpperCase()
}
}
});
app.PostRoute=Ember.Route.extend({
模型:函数()
{
返回用户;
}
});
app.PostController=Ember.ObjectController.extend({
你好:“afa”,
handleclick:函数()
{
警报(“呼叫控制站事件”);
this.controllerFor('application').send('makeMeUpper');
}
});
变量用户=[
{
id:“1”,
名称:“寿司”
},
{
id:“2”,
姓名:“阿米特”
}
];
//哈佛商学院
单击此处调用Post控制器事件
{{input type=“text”action=“makeMeUpper”value=firstName}}
{{{#如果检查}}
没有记录
{{else}
{{firstName}}{{lastName}}
{{/if}
{{{#链接到'post'}单击{{/linkTo}
{{outlet}}
单击此处调用应用程序控制器事件
由于controllerFor已被弃用,现在正确的做法是在控制器中指定需要,从控制器列表中检索它,然后发送到那里。例如:
App.SomeController = Em.Controller.extend({
needs: ['other'],
actions: {
sayHello: function () {
console.log("Hello from inside SomeController.");
this.get('controllers.other').send('helloAgain');
}
}
});
App.OtherController = Em.Controller.extend({
actions: {
helloAgain: function () {
console.log("Hello again from inside OtherController!");
}
}
});
编辑:哎呀。。。看起来有人已经发布了这个答案。如果需要,将进行修改。顺便说一句,根据指南,视图将在当前控制器中找到操作,因为此视图不涉及任何状态转换,因此当前控制器始终是ApplicationController
。因此,如果您想使用其他控制器,最好使用needs
属性自己管理控制器依赖关系。这是今后的首选方法。另外,如果你需要使用嵌套文件夹,这是我在另一篇文章中提供的解决方案:是的,你说得对,render也可以帮我解决这个问题,非常感谢。是的。我在最新版本的Ember.jsNope上测试了这个。在控制器内部使用控制器将抛出不推荐的消息。请参阅获取其他控制器实例,您必须在控制器中使用needs
,并且可以在routes中使用controllerFor
。@selvagsz是正确的<代码>需求
是按照文档进行此操作的首选。他提供了以下解决方案:
/// <reference path="Lib/ember.js" />
var app = Ember.Application.create()
app.Router.map(function () {
this.resource('post')
});
app.ApplicationRoute = Ember.Route.extend({
model: function () {
return { "firstName": "amit", "lastName": "pandey" }
}
});
app.ApplicationController = Ember.ObjectController.extend({
Address: "House no 93-B",
fullName: function () {
return this.get("model.firstName") + " " + this.get("model.lastName")
}.property("model.firstName", "model.lastName"),
actions: {
submit: function (name) {
this.controllerFor('post').send('handleclick')
},
makeMeUpper:function()
{
alert('calling application controller Event');
this.set("model.firstName",this.get("model.firstName").toUpperCase())
}
}
});
app.PostRoute = Ember.Route.extend({
model:function()
{
return user;
}
});
app.PostController = Ember.ObjectController.extend({
Hello: "afa",
handleclick: function ()
{
alert('calling post controller Event');
this.controllerFor('application').send('makeMeUpper');
}
});
var user = [
{
id: "1",
Name: "sushil "
},
{
id: "2",
Name: "amit"
}
];
<script type="text/x-handlebars">
<button {{action submit firstName}}>CLICK HERE TO CALL Post controller event</button>
{{input type="text" action= "makeMeUpper" value=firstName }}
{{#if check}}
No Record Exist
{{else}}
{{firstName}}{{lastName}}
{{/if}}
{{#linkTo 'post'}}click {{/linkTo}}
{{outlet}}
</script>
<script type="text/x-handlebars" id="post">
<button {{action hanleclick}}>Click here to call application controller event</button>
</script>
App.SomeController = Em.Controller.extend({
needs: ['other'],
actions: {
sayHello: function () {
console.log("Hello from inside SomeController.");
this.get('controllers.other').send('helloAgain');
}
}
});
App.OtherController = Em.Controller.extend({
actions: {
helloAgain: function () {
console.log("Hello again from inside OtherController!");
}
}
});