1

我正在尝试制作一个与链接到相同的事情的自定义助手,除了更多的假设。

我正在努力做到这一点:

{{#my-link-to widget.href}}{{widget.title}}{{/my-link-to}}

它仅采用路由参数(widget.href),并且路由假定为“根”。这是我实施它的方式:

Ember.Handlebars.registerHelper('my-link-to', function() {
  var args = [].slice.call(arguments);
  args.unshift('root'); // always use the 'root' route

  return Ember.Handlebars.helpers['link-to'].apply(this, args);
});

但是,我生成的链接结果都指向/#并且我得到一个This link-to is in an inactive loading state because at least one of its parameters presently has a null/undefined value, or the provided route name is invalid.错误。

按预期执行{{#my-link-to 'root' widget.href}}{{widget.title}}{{/my-link-to}}和删除工作。args.unshift('root')

我在这里展示了一个小提琴:http: //jsfiddle.net/p2R9y/3/

我对 Ember.js 真的很陌生,所以如果我做错了什么,请告诉我。

4

2 回答 2

1

传递给把手视图助手的每个参数都有一些额外的信息。因此args.unshift('root');,您需要说出“root”的含义还不够:绑定字符串文字等。在您的情况下是字符串文字,因为预期的用法是:

{{#my-link-to-works 'root' widget.href}}

您需要STRING在选项哈希types键中使用

Ember.Handlebars.registerHelper('my-link-to-fails', function() {
  var args = [].slice.call(arguments),
      options = args[args.length-1]; // last argument is always the options hash

  args.unshift('root');
  // the types says what is the type of each argument, in that case we need STRING
  options.types.unshift('STRING');

  return Ember.Handlebars.helpers['link-to'].apply(this, args);
});

我用这段代码更新了你的小提琴,请看一下http://jsfiddle.net/marciojunior/sR96j/

于 2013-10-25T23:00:35.107 回答
0

我想知道你的问题。

1.你把你的例子弄混了

您正在添加'root'my-link-to-works帮助程序:

{{#my-link-to-works 'root' widget.href}}

并对my-link-to-fails助手进行 unshift。所以实际上这两个例子是不同的。一个有两个参数(例如:'root' 和 '/widget/foo'),而另一个只有一个(例如:'/widget/foo')。

2. 无论如何,为什么当第一个参数是“root”时它会起作用?

链接到帮助程序的第一个参数必须是routeName. 该助手还可以接收第二个参数,该参数提供一个显式的动态段值,该值将其值附加到已解析的路由中。这就是你的论点被解释的方式。如果您检查您的示例,则工作链接会解析为,例如#//widget/foo. 您可能会注意到那里的两个正斜杠,这是您已解决的路线#/+ 您的段值的结果/widget/foo

3. 解决方案?

直接使用链接到帮助器:并从您的 href 字符串{{link-to 'widget' 'widget.href'}}中删除该部分或执行以下操作:http: //jsfiddle.net/tqFJ3/4//widget/

助手:(这个和link-to直接使用一样)

Ember.Handlebars.registerHelper('my-link-to-works', function() {
  // Do extra stuff here...
  return Ember.Handlebars.helpers['link-to'].apply(this, arguments);
});

更改您的小部件 href 并仅保留动态段:

App.IndexRoute = Ember.Route.extend({
    model : function() {
        return {
            widgets: [
              { href: 'foo' },
              { href: 'bar' },
              { href: 'baz' }
            ]
        };
    }
});
于 2013-10-25T22:53:04.000 回答