Javascript 从模板发送到组件生命周期方法时数据损坏?
EMBER版本3.10 说明 如果我将一个对象数组从一个模板传递给一个组件(在模板视图中迭代该数组之后),并尝试访问该组件的一个生命周期方法中的数据。数据已损坏 代码 controllers/application.js 模板/application.hbs 组件/filter-users.js 输出 带有bug 没有错误 如果我从迭代数组的Javascript 从模板发送到组件生命周期方法时数据损坏?,javascript,ember.js,Javascript,Ember.js,EMBER版本3.10 说明 如果我将一个对象数组从一个模板传递给一个组件(在模板视图中迭代该数组之后),并尝试访问该组件的一个生命周期方法中的数据。数据已损坏 代码 controllers/application.js 模板/application.hbs 组件/filter-users.js 输出 带有bug 没有错误 如果我从迭代数组的application.hbs中删除每个块。我得到了正确的结果 模板/application.hbs {{outlet}} 我是ember的新手,所
application.hbs
中删除每个块。我得到了正确的结果
模板/application.hbs
{{outlet}}
我是ember的新手,所以这是一个bug还是我没有按照ember的方式来做?这是一个调试功能!
您的对象被包装在代理对象中。因为在模板中使用{{user.name}}
后,您可能无法执行此操作。get('users')[0]。name=“bla”
但必须执行此操作。get('users')[0]。为ember设置('name','bla')
,以更新模板。如果尝试此操作,代理对象将抛出错误。
因为代理在所有浏览器中都不可用,并且可能会影响性能,所以这不是在生产构建中完成的。因此,在生产构建中没有proixies
(旁注:如果代理在所有情况下都可用,您就不需要执行this.get('users')[0]。根本不需要设置('name','bla')
。如果没有代理,则无法检测this.get('users')[0]。name=“bla”
,这将中断。因此,开发中的代理应该通过抛出错误来帮助您避免此问题)
重要的一点是:代理应该没有效果!唯一看起来不同的是调试日志,因为会显示代理信息。因此,您必须打开对象以查看名称
,然后单击它以执行getter:
但是,这样的代码仍然可以工作:
console.log(this.get("users")[0].name);
但是,如果每个块都被移除,为什么它会给出正确的结果呢。检查我提到的无缺陷部分。无论每个块是否存在,结果都必须一致。你能详细说明一下吗?如果没有每个块,你就不会使用模板中的对象。因此,使用本地setter并不危险。所以它没有包装在警告代理中。此外,添加代理不会改变行为。所以它是一致的。要明确的是:在每种情况下,这都是一个正确的结果!就在调试控制台中,您可以看到调试错误。
{{#each users as |user|}}
<p>{{user.name}}</p>
{{/each}}
<FilterUsers @users={{users}} />
{{outlet}}
empty file
import Ember from 'ember';
export default Ember.Component.extend({
init(){
this._super(...arguments);
console.log(this.get('users'));
}
});
<FilterUsers @users={{this.users}} />
{{outlet}}
console.log(this.get("users")[0].name);