Ember.js: 在3.8.0-beta.1中包含句点的键上的each-in中断

创建于 2019-01-29  ·  25评论  ·  资料来源: emberjs/ember.js

{{each-in}}将为其键包含句点的值返回undefined

此错误在3.7.2中不存在,并且首先出现在3.8.0-beta.1中,并且仍然存在于3.8.0-beta.3中。

失败测试(放入packages/@ember/-internals/glimmer/tests/integration/syntax/each-in-test.js

[`<strong i="11">@only</strong> each-in supports keys with a period in them`]() {
  this.render(
    strip`
    <ul>
      {{#each-in categories as |_ item|}}
        <li>{{item.name}}</li>
      {{/each-in}}
    </ul>
  `,
    {
      categories: {
        // uncomment and run.  notice `items` is undefined
        'hello.world': { name: 'foo' },
        // uncomment and run.  notice it works as expected
        // hello world: { name: 'foo' },
      },
    }
  );

  // Empty
  this.assertHTML(strip`
    <ul>
      <li>foo</li>
    </ul>
  `);
}

最有用的评论

所有25条评论

@jasonmit您可以通过失败的测试发送PR吗?

我们绝对应该从根本上解决这个问题,但是我不确定这最终是否会成为错误。 具体来说, get(obj, 'hello.world')将查找obj.hello.world而不是obj['hello.world'] ...

是的,可以肯定的是,每个输入使用get的原因,所以这有点类似于点路径票证的get。 在这种特定情况下,Mayyyybe我们不需要在登陆ES5吸气剂之后在这里使用get,因为这可能无论如何都不适用于代理?

特别是https://github.com/emberjs/ember.js/blob/master/packages/%40ember/-internals/glimmer/lib/utils/iterable.ts#L128

我同意我不确定是否将其视为错误,并且现在解决此问题是否会在其他地方或未来引起问题

是的,我实际上认为我们根据对这里要迭代的对象的启发法来做不同的事情:

https://github.com/emberjs/ember.js/blob/7df81ec411b2da73086f63bf6a26b113dfa5a1a2/packages/%40ember/-internals/glimmer/lib/utils/iterable.ts#L290 -L298

其中一些迭代器使用getObjectIterator.fromIndexable ),另一些不使用( ObjectIterator.fromForEachableMapLikeNativeIterator.from

在这种情况下,我们正在查看fromIndexable 。 我认为不使用get的唯一问题是带有cps的pojos

@chancancode-是的,我只是指出是因为@jasonmit可以通过使对象实现Symbol.iterable解决该问题。

@jasonmit您可以通过失败的测试发送PR吗?

毫无疑问,我现在将这样做并关联问题。

是的,我只指出是因为@jasonmit可以通过使对象实现Symbol.iterable来解决该问题。

好主意,我会尝试解决的方法。

如果您想知道为什么键中有句点,则要迭代的对象中的键是ISO字符串(即2011-10-05T14:48:00.000Z ),而这些键在UTC偏移量之前有句点。

只想知道这是什么状态? 谢谢大家

@ amk221我不认为这已解决,我们最终重构了我们的应用程序以避免出现关键时期,但显然不是每个人的理想解决方案。

大家好,我为此做了一个公关,要求进行评论:D

我能做些什么来推动这一进展? 我们真的需要这个🤞

@ amk221您可以添加一个助手。 那就是我解决问题的方式。
但是,这很关键。

只是浪费了几个小时-我是Ember的新手,这完全令人惊讶。

对于我的应用程序,我正在跟踪一堆主机的状态,因此请按IP或域名键入哈希值。 除了localhost之外,其他所有内容都返回undefined,而我正试图找出答案使自己发疯。

@ devop911关心分享您的助手help

@ amk221不是您要问的那个,但我最终用了一堆:

import { helper } from '@ember/component/helper';
import _ from 'lodash';

export function hashToArray([h]) {
  return _.map(h, function(value, key) {
    return {
      key: key,
      value: value,
    }
  });
}

export default helper(hashToArray);

我也刚遇到这个问题。 任何更新?

我不确定我们是否可以解决此问题而无需回归get的通用用例。 如果我们可以得到一个表明回归还不错的基准,那么可以将其添加到get可能很好,但是如果没有,那么我们需要直接将修复构建到each-in 。 我怀疑这将是一个不错的回归。

我们可以手动检查代理并在对象上使用unknownProperty (如果它是代理),否则特别是在使用each-in迭代对象时使用正常的get语法,这可能会按预期工作。

长期追踪的道具不能很快到来😩

长话短说:切换到Ember之后再切换。 这不值得所有麻烦。

像这样的@ devop911注释并不是

我们会及时解决此问题,它只需要比典型问题多做一些工作,而我们一直专注于Octane的发布功能。 我同意,但这很重要。

@pzuraq
让用户决定如何命名其密钥,决不能成为一种极端情况。

@pzuraq我认为,如果each-in的密钥包含句点,我们至少应该发出一条警告。 但是,如果不引入回归就没有很好的解决方案,那是对的

@ devop911极端案例的评估是基于这样一个事实,即自从打开此问题以来,我们几乎没有看到有关此错误的全部报告。 如果这是每个Ember应用程序都依赖的行为,那么绝对可以算是一个更高优先级的修复程序,但是似乎没有多少人在密钥中使用句点。

另一方面,每当我们降低性能时,我们都会收到很多抱怨。 如果这不是一个热门的途径,那么肯定会早很多解决此问题。 就像我说的,作为维护者,这是一个困难的情况,尤其是当您试图完成工作时。😩我将看到我们可以做些什么来使某个人早日完成这项工作。

@ rwwagner90我确实认为我们可以解决此问题,所以我宁愿不发出警告,但是如果我们无法解决此问题,我同意我们一定会警告用户。

谢谢大家提出解决方案❤️

此页面是否有帮助?
0 / 5 - 0 等级