ember.js - {{action}} 使用关系 id 与transitionTo链接

标签 ember.js

给定一个具有诸如 { id: 1, form_id: 5} 之类的上下文的 View ,我想使用以下命令创建指向表单的 {{action}} 链接form_id

我的 View 代码如下所示:

<script type="text/x-handlebars" data-template-name="group">
  {{action showForm form_id href=true}}
</script>

我的路由器中的操作如下所示:

showForm: function(router, event) {
  var form_id = event.context;
  router.transitionTo('root.form', { id: form_id });
},

我收到一条错误消息:

Uncaught Error: assertion failed: You must specify a target state for event 'showForm' in order to link to it in the current state 'root.index'.

我猜测问题出在我为 transitionTo 设置上下文的方式上,但我一直无法找出正确的解决方案。

这是重现问题的完整代码:

<script type="text/x-handlebars" data-template-name="application">
  {{outlet}}
</script>

<script type="text/x-handlebars" data-template-name="group">
  {{action showForm form_id href=true}}
</script>

MyApp = Ember.Application.create({
  autoinit: false
});

MyApp.router = Ember.Router.create({
  root: Ember.Route.extend({
    index: Ember.Route.extend({
      route: '/',

      // Throws error: 
      //    You must specify a target state for event 'showForm' in 
      //    order to link to it in the current state 'root.index'
      //
      showForm: function(router, event) {
        var form_id = event.context;
        router.transitionTo('root.form', { id: form_id });
      },

      // Won't work because form deserialize finds id, not form_id 
      //showForm: Em.Route.transitionTo('root.form'),

      // This won't work either
      // showForm: Em.Route.transitionTo('root.form', { id: this.form_id }),        

      connectOutlets: function( router, context ){
        var group = Em.Object.create({ id:1, form_id: 5 });
        router.get( 'applicationController' ).connectOutlet( 'group', group );
      }
    }),
    form: Ember.Route.extend({
      route: '/form/:id',
      serialize: function( router, context ){
        return { id: context.id }
      },
      deserialize: function( router, context ){
        var form = Em.Object.create({ id: 5, name: 'my form' });
        return MyApp.Form.find( context.id );
      },
      connectOutlets: function( router, context ){
        // left out for fiddle example 
      }
    })
  })
});

MyApp.ApplicationController = Ember.Controller.extend({});

MyApp.GroupController = Em.ObjectController.extend({});
MyApp.GroupView = Em.View.extend({ templateName:  'group' });

MyApp.initialize(MyApp.router);​

以及相应的 fiddle :

http://jsfiddle.net/jefflab/LJGCz/

最佳答案

我能够使用计算属性作为我的操作的上下文来想出一个丑陋的解决方案来解决这个问题。关键片段是:

<script type="text/x-handlebars" data-template-name="group">
  <a {{action showForm view.formHash href=true}}>go to form</a>
</script>

MyApp.GroupView = Em.View.extend({ 
  templateName:  'group',
  formHash: function() {
    return { id: this.get('controller').get('form_id') };
  }.property('form_id')
});

工作 fiddle 在这里:

http://jsfiddle.net/jefflab/pGv8u/

但是,在与 Tom Dale 交谈后,很明显解决此问题的“正确方法”是使用物化对象而不是 id 值。如果您使用 Ember 数据,那么这是“侧面加载”belongsTo 功能的一个很好的用例。

关于ember.js - {{action}} 使用关系 id 与transitionTo链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13691667/

相关文章:

ember.js - 更改路线时重新渲染模板

ember.js - 注册适配器 : register different adapter for different types

ember.js - ember-data v1.0.0中的单表继承

javascript - 使用 link-to 从不同的 Controller 调用操作

javascript - EmberJS 应用程序的共享按钮

ember.js - Emberjs 1.x-pre- Ember.Router 和 Ember.compulated 问题

node.js - 使用 Bower Ember CLI 导入依赖项 - 找不到模块

ember.js - 从 ember-cli 中的vendor.js 中排除 jQuery

javascript - ember 组件的动态参数

ember.js - 未对 Foundation 模态中包含的元素触发的操作