Ember.js: при использовании {{action}}, как настроить целевой контроллер?

Я поставил свой вопрос в примере кода:

http://jsbin.com/urukil/12/edit

См., я могу использовать {{action}} (который помещается в дочерний вид) с параметром target для запуска события в ApplicationView или ApplicationController или ChildView, только за исключением ChildController, который это тот, который я действительно хотел.

В соответствии с документом, если не указано target, само событие должно обрабатываться в соответствующем контроллере, в моем случае, который должен быть ChildController. Но почему это действие всегда ищет в ApplicationController? Я пропустил что-то явно важное?

Ответ 1

Используйте this.controllerFor('') для вызова другого события контроллера. Ниже приведен рабочий пример.

JS:

/// <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"

    }

];

//HBS

 <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>

Ответ 2

Вы можете использовать needs для вызова действия на другом контроллере...

 App.ApplicationController = Ember.Controller.extend({
  needs: ['child'],
  doSomething: function() {
  alert("From ApplicationController");
  }
});

И цель может быть указана как "controllers.child" из шаблона

<p {{action doSomething target="controllers.child"}}>Blah blah</p>

Вот ваша рабочая скрипка...

http://jsbin.com/agusen/1/edit

Ответ 3

Насколько я знаю, класс представления не меняет текущий контроллер. Поскольку вы вызываете представление из шаблона приложения, оно остается в ApplicationController.

Рекомендации Emberjs.com по визуализации:

{{render}} does several things:

When no model is provided it gets the singleton instance of the corresponding controller

Простое изменение кода с точки зрения на вызов рендеринга, похоже, делает трюк:

Trigger ApplicationController
</p>
{{render 'child'}}

Ответ 4

Поскольку 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!");
    }
  }

});

EDIT: oops... Похоже, кто-то уже отправил этот ответ по существу. При необходимости изменится.