从模板发送到组件生命周期方法时数据损坏了吗?
Data corrupted when sending from template to component lifecycle method?
EMBER 版本 3.10
描述
如果我将一个对象数组从模板(在模板视图中迭代该数组之后)传递给一个组件,并尝试在该组件的生命周期方法之一中访问数据。数据已损坏。
代码
controllers/application.js
import Ember from 'ember';
export default Ember.Controller.extend({
users: [{name:1},{name:2},{name:3}]
});
templates/application.hbs
{{#each users as |user|}}
<p>{{user.name}}</p>
{{/each}}
<FilterUsers @users={{users}} />
{{outlet}}
templates/components/filter-users.hbs
empty file
components/filter-users.js
import Ember from 'ember';
export default Ember.Component.extend({
init(){
this._super(...arguments);
console.log(this.get('users'));
}
});
输出
有错误
没有错误
如果我从迭代数组的 application.hbs
中删除每个块。我得到了正确的结果。
templates/application.hbs
<FilterUsers @users={{this.users}} />
{{outlet}}
我是 ember 的新手,所以这是一个错误还是我没有按照 ember 的方式做?
这是调试功能!
您的对象包装在代理对象中。因为在模板中使用 {{user.name}}
之后,您可能不会执行 this.get('users')[0].name = "bla"
,但必须为 ember 执行 this.get('users')[0].set('name', 'bla')
才能更新模板。如果您尝试这样做,代理对象将抛出错误。
由于代理并非在所有浏览器中都可用,并且可能会对性能产生影响,因此在生产构建中不会这样做。所以在生产构建中没有代理。
(旁注:如果代理在所有情况下都可用,则您根本不需要执行 this.get('users')[0].set('name', 'bla')
。如果没有代理,则无法检测到 this.get('users')[0].name = "bla"
,这会中断。所以代理在开发应该通过抛出错误来帮助您避免这种情况)
重要的部分是:代理应该没有效果!唯一看起来不同的是调试日志,因为显示了代理信息。所以你必须打开对象才能看到 name
然后点击它来执行 getter:
但是这样的代码仍然有效:
console.log(this.get("users")[0].name);
EMBER 版本 3.10
描述
如果我将一个对象数组从模板(在模板视图中迭代该数组之后)传递给一个组件,并尝试在该组件的生命周期方法之一中访问数据。数据已损坏。
代码
controllers/application.js
import Ember from 'ember';
export default Ember.Controller.extend({
users: [{name:1},{name:2},{name:3}]
});
templates/application.hbs
{{#each users as |user|}}
<p>{{user.name}}</p>
{{/each}}
<FilterUsers @users={{users}} />
{{outlet}}
templates/components/filter-users.hbs
empty file
components/filter-users.js
import Ember from 'ember';
export default Ember.Component.extend({
init(){
this._super(...arguments);
console.log(this.get('users'));
}
});
输出
有错误
没有错误
如果我从迭代数组的 application.hbs
中删除每个块。我得到了正确的结果。
templates/application.hbs
<FilterUsers @users={{this.users}} />
{{outlet}}
我是 ember 的新手,所以这是一个错误还是我没有按照 ember 的方式做?
这是调试功能!
您的对象包装在代理对象中。因为在模板中使用 {{user.name}}
之后,您可能不会执行 this.get('users')[0].name = "bla"
,但必须为 ember 执行 this.get('users')[0].set('name', 'bla')
才能更新模板。如果您尝试这样做,代理对象将抛出错误。
由于代理并非在所有浏览器中都可用,并且可能会对性能产生影响,因此在生产构建中不会这样做。所以在生产构建中没有代理。
(旁注:如果代理在所有情况下都可用,则您根本不需要执行 this.get('users')[0].set('name', 'bla')
。如果没有代理,则无法检测到 this.get('users')[0].name = "bla"
,这会中断。所以代理在开发应该通过抛出错误来帮助您避免这种情况)
重要的部分是:代理应该没有效果!唯一看起来不同的是调试日志,因为显示了代理信息。所以你必须打开对象才能看到 name
然后点击它来执行 getter:
但是这样的代码仍然有效:
console.log(this.get("users")[0].name);