【问题标题】:How to pass a model to a template rendered from a route in Ember 1.6如何将模型传递给从 Ember 1.6 中的路由渲染的模板
【发布时间】:2014-07-29 11:04:09
【问题描述】:

我正在尝试在路由的渲染模板中设置模型。模型正在通过模板调用正确捕获:

{{#each itemController="user"}}
  <div {{bind-attr class="isExpanded:expanded"}}>
  <div><button {{action "sayHello" this}}>{{first_name}} {{last_name}}</button></div>

和我的路线:

Newkonf.UsersRoute = Ember.Route.extend({
  isExpanded: false,

  actions: {
   sayHello: function(myModel){

      alert('first name: ' + myModel.first_name); // <- this works
      // this.render('edit-user', {model: myModel});  <- doesn't work but not sure since this leads me to susupec 
      // it might https://github.com/emberjs/ember.js/issues/1820
      // this.set('model', myModel}); <- doesn't work
      this.render('edit-user');
    }
  }
}

车把是:

going to edit user here first name: {{first_name}}

编辑 1

我可以在 UsersRoute 中更新消息,它会相应地更新。我有点因为我指定了 UserController 会导致 UserRoute 优先,但我想不会。

这是我的路由器:

Newkonf.Router.map(function() {
  // this.resource('posts');
  
  this.route('about', { path: '/about'});
  this.resource('users', { path: '/users'}); 
});

编辑 2

我必须像这样处理我的 modal.js.hbs:

within modal for you:
{{model.first_name}}

因为这不起作用:

within modal for you:
{{first_name}}

不知道为什么。

这是我的路线:

Newkonf.ApplicationRoute = Ember.Route.extend({

  actions:{
    somePlace: function(item){
     alert('here i am in somePlace: ' + item.last_name); // <- this works
     var modalController = this.controllerFor('modal');
     modalController.set('model', item);
     var myjt=modalController.get('model');  
     console.log('my value:' + myjt.first_name); // <- this works
     this.render('modal', {
       into: 'application',
       outlet: 'modal3',
       controller: modalController
      });
    }
  }
});

而且没有控制器。

【问题讨论】:

  • 你会展示你的路由器吗?当您单击操作时,您是否在用户路线中?
  • 您的主要目标是用不同的模板替换用户模板吗?
  • 我最终希望在一个新的“模态”插座中呈现一个模板,并且不替换当前的插座模板,而只是希望现在能够传递模型。

标签: ember.js


【解决方案1】:

渲染到特定的插座需要命名插座,并且当您尝试渲染到它时,插座要在视图中。

对于模态框,将其置于应用程序模板中通常是一个不错的选择,因为应用程序始终在视图中。

  actions: {
    openModal: function(item){
      var modalController = this.controllerFor('modal');
      modalController.set('model', item);
      this.render('modal', {  // template
        into: 'application',  // template the outlet lives in
        outlet: 'modal',      // the outlet's name
        controller: modalController  // the controller to use
      });
    }
  }


  App.ModalController = Em.ObjectController.extend();

在上面的例子中,我使用名为modal ({{outlet 'modal'}}) 的插座将模板modal 渲染到application,并创建了一个控制器来支持我正在渲染的模板。在这个过程中,我在控制器上设置了模型,它将在模板中使用。

您可以阅读有关模态的更多信息:http://emberjs.com/guides/cookbook/user_interface_and_interaction/using_modal_dialogs/

下面是示例: http://emberjs.jsbin.com/pudegupo/1/edit

【讨论】:

  • thx kingpin2k - 这很有意义。我注意到的一件事是我需要在我的模态模板中使用{{model.first_name}} 之类的东西,我不确定为什么......可能是一个单独的问题。也许是因为我没有使用App.ModalController = Em.ObjectController.extend();,而只是使用了代理控制器(如果这有意义的话。
  • 是的,您使用的是普通的 Em.Controller.extend 吗?如果是这样,它不会自动从控制器范围代理到模型。
  • hmm...但它在您的 jsbin 示例代码中工作...我敢肯定它可能只是我不明白。你是说你如何使用它应该工作?我也在 1.6beta5 - 也许我会回到 1.5 看看是否能解决它。
  • 我可能误解了你说的意思,你的代理控制器是什么?
  • thx kingpin2k - 我没有控制器,但包含了我的代码(与您的代码非常相似),它以{{model.first_name}} 输出,但不仅仅是{{first_name}}。非常感谢您的帮助
猜你喜欢
  • 2017-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-20
  • 2018-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多