Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从模板发送到组件生命周期方法时数据损坏?_Javascript_Ember.js - Fatal编程技术网

Javascript 从模板发送到组件生命周期方法时数据损坏?

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的新手,所

EMBER版本3.10

说明

如果我将一个对象数组从一个模板传递给一个组件(在模板视图中迭代该数组之后),并尝试访问该组件的一个生命周期方法中的数据。数据已损坏

代码

controllers/application.js

模板/application.hbs

组件/filter-users.js

输出

带有bug

没有错误

如果我从迭代数组的
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);