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!");
    }
  }

});