์ปฌ๋ ์
๋ด ๊ฐ์ฒด์ ์ค์ฒฉ ์์ฑ์ ๊ด์ฐฐ์๋ฅผ ์ถ๊ฐํ๋ฉด ์์ ์ ์ผ๋ก ์คํ๋์ง ์์ต๋๋ค. ์ด๋ฅผ ์ค๋ช
ํ๋ ember-runtime/tests/mixins/array_test.js
์ถ๊ฐ ํ ์์๋ ํ
์คํธ ์ผ์ด์ค๋ฅผ ๋ง๋ค์์ต๋๋ค. EachProxy ์์ฒด์์ ์ค์ฒฉ ๋ ์์ฑ์ ๊ด์ฐฐํ๋ฉด ์ ๋๋ก ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ @each.nest.isDone
์ฌ์ฉํ์ฌ ์์ฑ์ ๊ด์ฐฐํ๋ ๊ฒ์ ๊ทธ๋ ์ง ์์ต๋๋ค.
๋ค์ ํ
์คํธ์์ count1
๋ 1๋ก ์ฆ๊ฐํ๊ณ count2
๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
test('modifying nested contents of an object in an array should call <strong i="11">@each</strong> observers', function() {
var ary = new TestArray([
Em.Object.create({ nest: Em.Object.create({ isDone: false}) }),
Em.Object.create({ nest: Em.Object.create({ isDone: false}) }),
Em.Object.create({ nest: Em.Object.create({ isDone: false}) }),
Em.Object.create({ nest: Em.Object.create({ isDone: false}) })
]);
var get = Ember.get, set = Ember.set;
var count1 = 0, count2 = 0;
// Works
var each = get(ary, '<strong i="12">@each</strong>');
Ember.addObserver(each, 'nest.isDone', function() { count1++; });
// Doesn't work
Ember.addObserver(ary, '@each.nest.isDone', function() { count2++; });
count1 = count2 = 0;
var item = ary.objectAt(2);
get(item, 'nest').set('isDone', true);
equal(count1, 1, '@each.nest.isDone should have notified - observing <strong i="13">@each</strong> array');
equal(count2, 1, '@each.nest.isDone should have notified - observing chain containing <strong i="14">@each</strong>');
});
@each
์ ํ ์์ค ๊น์ด ๋ง ์ง์๋ฉ๋๋ค. ๋ ๋ง์ด ํ์ฉํ๋ฉด ์ข๊ฒ ์ง ๋ง ๊ธฐ์ ์ ์ผ๋ก ์ผ๋ง๋ ์ด๋ ค์ธ ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. @wycats ๋๋ @tomdale์ด์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํ๋๋กํ๊ฒ ์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ์ฌ์ค์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๊ทธ๊ฒ์ ์ ์์ ์ธ ์ฒด์ธ ์ธํ๋ผ๋ฅผ ์ฌ์ฉํ๊ณ ์์๋ก ์ฌ๋ฌ ์์ค์์ ์๋ํด์ผํฉ๋๋ค.
@wycats ์ด๊ฒ์ ๋ฒ๊ทธ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค. ํ ๋จ๊ณ ์ด์ ๊น์ด ์๋ํ๋ ๊ฒ์ ๋ณธ ์ ์ด ์์ต๋๋ค.
๋์ํฉ๋๋ค. ์ด๊ฒ์ ๋ฒ๊ทธ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค. ๋๋ ์ด๊ฒ์ด ์ด๋ ์์ ์์ ํจ๊ณผ๊ฐ ์๋ค๊ณ ๋ฏฟ์ต๋๋ค. ๋จ์ ํ ์คํธ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๊ทธ๋์ ๋๋ ์ด๊ฒ์ ํตํด ๋นํฉํ์ต๋๋ค. ์์ ์ ๋ฃจํธ๋ก ์ฌ์ฉํ์ฌ addObserver๋ฅผ ํธ์ถ ํ ๋ ๋ด๋ถ์ ์ผ๋ก ๊ด์ฐฐ์๋ฅผ ์ค์ ํ๋ EachProxy ์ฒ๋ฆฌ๋ก ์์ฝ๋๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฒด์ธ ๊ฒฝ๋ก์ ์ผ๋ถ๋ก ChainNode๋ EachProxy์์ ์ต์์ ํค ์ด๋ฆ์ ๋ฝ์ ๋ฉ๋ฆฌ ๋ฐฉ์์ผ๋ก ์งํํ๋ฉฐ EachProxy๋ ์ ๋ ๊ด์ฌํ์ง ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ ๊ฐ์ง ์์ค์ ๋ฐฐ์ด์ด ์์ต๋๋ค.
์ด ๊ฒฝ์ฐ '@ each.nest. @ each.isDone'์์ฒญ์ด ์๋ํฉ๋๋ค.
ChainNode๊ฐ EachProxy์์ ํค ์ด๋ฆ์ ๋ฝ์ ๋ EachArray๋ฅผ ๊ฐ์ ธ ์ค๋ฏ๋ก @ each ์ต์ ๋ฒ๋ฅผ ์ค์ฒฉํด์ผํ๋ค๋ ๊ฒ์ ๋ช ํํํ๋ ๊ฒ์ ์์์ต๋๋ค.
์ฒด์ธ์ด ์๋ํ๋ ๋ฐฉ์์ ๊ฐ ์ฒด์ธ ๋ ธ๋์ ๋ ธ๋์ ๋ถ๋ชจ value ()์์ ํค๋ฅผ ๊ฐ์ํ๋ ํด๋น chainWatcher๊ฐ ์์ผ๋ฉฐ, ์ด๊ฒ์ด ์๋ํ๋ ค๋ฉด ์ฒด์ธ์ด @each ์์ ์ค์งํ๊ณ ๋๋จธ์ง ๊ฒฝ๋ก๋ก
๋๋ ์ด๊ฒ์ ์๋ฏธํ๋ ํน์ ์ผ์ด์ฑ @ ๋ฌธ์๋ฅผ ๊ณ ๋ คํ๊ณ ์์ต๋๋ค.
@kselden , simplify-properties
์ง์ ์ด์ด ๋ฌธ์ ๋ฅผ ์ ํ ๋ค๋ฃจ์ง ์์ต๋๊น?
์ฌ์ ํ ๋ฌธ์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
์ฒด์ธ์ ๋ฐฐ์ด์ ์์ฑํ๋ ์์ฑ์ ํตํด ์ฐ๊ฒฐ๋์ง ์์ผ๋ฉฐ ์์์ ์ธ๊ธ ํ ๋ช ๊ฐ์ง ๋ณ๊ฒฝ์ด ํ์ํฉ๋๋ค. ๋ํ ๋ฐฐ์ด์ด ๋ณ๊ฒฝ ๋ ๋ @each ์์ฒด๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ๋ ๋ฌธ์ ์ ๋๋ค.
์ด ๋ฌธ์ ์ ์ง๋ฉด ํ ๋ชจ๋ ์ฌ๋์ ์ํด (ํนํ ember-data ์ฐ๊ฒฐ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ) ์ฐ๊ฒฐ์ ๋ค๋ฅธ ์ชฝ ๋์์ ์์ฑ์ ํ์ธํ๋ ์์ฑ์ ์ฐ๊ฒฐ์ ํ์ชฝ์ ์ถ๊ฐํ์ฌ์ด ๋ฌธ์ ๋ฅผ ํดํนํ์ต๋๋ค (์ ๊ฒฝ์ฐ์๋ isLoaded) ๊ทธ๋ฐ ๋ค์ @each
๋ค์์ ์ฌ์ฉํฉ๋๋ค. ๋ด๊ฐ ๋งํ๋ฏ์ด ์ด๊ฒ์ ํดํน์
๋๋ค. ๊ทธ๋ฌ๋ 1.1๊น์ง๋ ๋๋ฅผ ์ํด ์๋ํฉ๋๋ค.
@tpitale : ๊ทธ๋ฐ ํดํน์ ์๋ฅผ ๋ณด์ฌ์ค ์ ์์ต๋๊น? ์ฐ๊ด์ฑ์ ๋ค๋ฅธ์ชฝ์ ์์ฑ์ ์ถ๊ฐํ๋ ๊ฒ์ด ๋ฌด์จ ์๋ฏธ์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
@kselden @wagenet : ์ต๊ทผ์ ๋น์ทํ ์ผ์ด ๋ฐ์ํ์ง๋ง ์์งํ ์ด๊ฒ์ด ๊ฐ์ ๋ฒ๊ทธ์ธ์ง ํ์คํ์ง ์์ต๋๋ค.์ด ๋ฐ์ด์ฌ๋ฆฐ์ ์ดํด๋ณผ ์ ์์ต๋๊น?
@drogus ์ผ๋ณธ์ด ์ ์ฃผ์ด์ง ๊ฒฝ๋ก nest.isDone์ํ nestIsDone ์์ฑ์ด์์ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ @each.nestIsDone
๊ด์ฐฐ ํ ์ ์์ต๋๋ค.
1.1์ด ์๋ 1.0์์ ์ด๊ฒ์๋ณด๊ณ ์ถ์ ๊ฒ์ ๋๋ค : +1 :
@mspisars ์ ๋ ๊ทธ๋ ์ต๋๋ค.ํ์ง๋ง ์์ ํ๊ธฐ ์ด๋ ต๊ณ ํ์์ ์ด์ง ์์ ๊ฒ์ 1.0์ ์ฐจ๋จํ๊ณ ์ถ์ง ์์ต๋๋ค.
๋ง์ง๋ง ํ๋ 4 ๊ฐ์ ์ ... : +1 :
@mspisars , @darthdeus 1.0์์๋๋ณด๊ณ ์ถ์ต๋๋ค. ๋ฌธ์ ๋ ์๋ง์ด ์๋๋ผ ๋ฅ๋ ฅ์ ๊ดํ ๊ฒ์ ๋๋ค.
: +1 : for 1.0 :์ด ์์ ์ ์ํํ๋ ๋ฐ ์ ๋ง ์ ์ฉํฉ๋๋ค.
: +1 : 1.0์ ๊ฒฝ์ฐ
๊ณต๊ณต ์๋น์ค ๋ฐํ : +1์ ๋ถ์กฑํ ๊ฐ๋ฐ ๋ฆฌ์์ค๋ฅผ ์ ๊ณตํ์ง ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ด๋ฏธ์ด ๊ธฐ๋ฅ์ ๊ฐ๊ณ ์ถ๋ค๋ ๋ฐ ๋์ํ์ง๋ง ์ง์ํ๋ ๊ฒ์ ๋งค์ฐ ์ฌ์ํ์ง ์์ต๋๋ค. 1.0์ ์ฐจ๋จํ ๊ฒ์ ํ์คํ ์๋๋๋ค.
@wagenet ๊ณผ ๋์ ํ ๋ค๋ฃจ๋ ์ฌ์ํ์ง ์์ ์ฝ๋ ๊ฒฝ๋ก์ ๋๋ค.
์ด๊ฒ์ ๋ํ ์
๋ฐ์ดํธ๊ฐ ์์ต๋๊น? ์ฐ๋ฆฌ๋ ์ฃผ์ ํธํ
์ฒด์ธ์์ ์ฌ์ฉํ๋ ค๊ณ ํ๋ ์น ์ฑ์์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ค๊ณ ์๋ํด ์์ผ๋ฉฐ ํด๊ฒฐ ๋ฐฉ๋ฒ ์ค ์ด๋ ๊ฒ๋ ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด ์์ ์์ ์คํ ๊ฐ๋ฅํ ์ ์ผํ ํด๊ฒฐ์ฑ
์ ์ธํฐํ์ด์ค์์ด ๋ถ๋ถ์ ์ฌ ์ค๊ณํ์ฌ ๋ ๊ฐ๋จํ๊ฒ ๋ง๋๋ ๊ฒ์
๋๋ค.
๋ชจ๋ ์ ๋ณด๋ ๋๋จํ ๊ฐ์ฌํ๊ณ ๋ชจ๋ ํ๋ฅญํ ์์
์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๋๋๋๋ก ์ด๋ ค์ด ๋ฌธ์ ์ ๋๋ค. ๋ฌธ์ ์ ์ผ๋ถ๋์ด๋ฅผ ๊ตฌํํ๊ฑฐ๋ ํด๊ฒฐํ๋๋ผ๋ ์ข ์ ๋ฐฐ์ด (๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก ์ธ ๊ฒ ๊ฐ์)์ ์ ๋ฐ์ดํธํ๋ ๋ฐ O (n * _2) ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ฉฐ ์ด๋ ๊ณต์ ํ ๊ฒฝ์ฐ์๋ ํฐ ๋ฌธ์ ์ ๋๋ค. ์์ ๋ฐ์ดํฐ ์ธํธ. O (n)์ด ๋๋ ค๋ฉด ์ข ์ ๋ฐฐ์ด์ ๊ตฌ์ฑํ๊ธฐ ์ํด ๋ ์ค๋งํธ ํ ๋ฐฐ์ด ํ๋ฆฌ๋ฏธํฐ๋ธ๊ฐ ํ์ํฉ๋๋ค. Peter์ ๋ค๋ฅธ ์ฌ๋๋ค์ * some_ ์์ ์ด ์์๊ณ , ์ฌ๋๋ค์ ํ์คํ ๊ทธ๊ฒ์ ์ถ์งํ๋ ๋ฐ ๊ด์ฌ์ด ์์ง๋ง ์จ์ ์ฐธ์ง ์์ ๊ฒ์ ๋๋ค.
๊ด๋ จ : # 1288, # 2711.
์ง๊ธ์ ๊ธฐ๋ณธ์ ์ผ๋ก "๊ณ์ฐ ๋ ๊ด๊ณ"๋ก ์๋ฒ์ ์ข ์ ๋ฐฐ์ด์ ์์ฑํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ ๋ค๋ฅธ ๋ฐ์ด์ฌ๋ฆฐ์ด ์์ต๋๋ค : http://jsfiddle.net/3bGN4/268.
์์ ํด๊ฒฐ ๋ฐฉ๋ฒ, ์ค์ฒฉ ๋ @each ํ์ :
์ด๊ฒ์ด backburner์์๋ ๊ฒฝ์ฐ์ด ํฐ์ผ์ ์ฐพ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ฏ๋ก API ๋ฌธ์์์์ด ๋์์ ๊ธฐ๋กํ๋ ๊ฒ์ด ๋์์ด ๋ ๊ฒ์ ๋๋ค.
@dandehavilland ๋ง์์! ' http://emberjs.com/guides/object-model/computed-properties-and-aggregate-data/ '์์ ํ์คํ ์ธ๊ธํด์ผํฉ๋๋ค. "@ each.goo.bar"๊ฐ ์ฌ์ ํ ์๋ํ์ง ์์ต๋๋ค.์ด ์ฌ์ค์ ์์๋ด๋ ๋ฐ ๋ฉฐ์น ์ด ๊ฑธ๋ ธ์ต๋๋ค.
์ข์ ์๊ฐ. https://github.com/emberjs/website/pull/653
ํ์ง๋ง ๊ธฐ์ ์ ์ผ๋ก๋ ์ค์ฒฉ ๋ ์์ฑ ๋ชจ์์ด ์๋๋ผ ์ค์ฒฉ ๋ ์์ฑ์ ๋ณผ ์ ์์ต๋๋ค.
์ํ-๊น๋์ ๊น๋ฐ์ ๋จ์์ ๋๋ค.
[email protected][email protected]
ํ์ง๋ง ๊ทธ๋์ผ
[email protected]
* ์๋ํ์ง ์์-ํ๋๊ทธ๋ ์ปฌ๋ ์ ์ ๋๋ค *
[email protected][email protected]
@ kingpin2k ์๋์, ๋๋ ๊ทธ ์ด๋ค ์ผ๋ ๋ฏฟ์ง ์์ต๋๋ค. ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ฐ์ดํธ๋์ง ์์ต๋๋ค.
[ํธ์ง : ๋ด๊ฐ ํ๋ ธ์ ์๋ ์์ต๋๋ค]
@joliss ์ฌ๊ธฐ์ jsbin์ด ์์ต๋๋ค. http://jsbin.com/IXalezO/11/edit
@kselden ์ด ๊ณง ์์ ํ ๊ฐ๋ฅ์ฑ์ด์๋ ์์ ์ ๋๊น?
์ด๊ฒ์ ์๋ํ์ง ์๋ ๊ฒ์ผ๋ก ๋ฌธ์ํ๋ฉ๋๋ค. ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ง๋ง ์ฐ์ ์์๊ฐ ์ถฉ๋ถํ์ง ์๊ฑฐ๋ ์ด๋ ต์ต๋๋ค. ๋๊ตฐ๊ฐ๊ฐ ์์ ํ๊ณ ์ถ๋ค๋ฉด PR์ ๊ฒํ ํด ๋๋ฆฌ๊ฒ ์ต๋๋ค.
๊ด์ฐฐํ๋ ค๋ ๋งค์ฐ ์ค์ฒฉ ๋ ๊ฐ์ฒด ๋ง ํฌํจํ๋ ์๋ก์ด ๊ณ์ฐ ๋ ์์ฑ์ ์ถ๊ฐ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ @each ๋ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํฉ๋๋ค.
๋ค์ ๋ฐฉ๋ฒ ์ฌ์ฉ
allTickets: function () {
var sections = this.get('sections'),
each = Ember.$.each,
tickets = [];
each(sections, function (i, section) {
each(section.rows, function (j, row) {
each(row.tickets, function (k, ticket) {
tickets.addObject(ticket);
})
});
});
return tickets;
}.property(),
checkedCount: function () {
///custom logic
return something;
}.property('[email protected]_checked')
๋์ ์
checkedCount: function () {
///custom logic
return something
}.property('[email protected][email protected][email protected]_checked')
: +1 :
์ด๊ฒ์ ๊ฐ์ด๋ ์์ ๋๋ฌด ์ฝ๊ฒ ๋์น ์ ์์ต๋๋ค. ์ค์ฒฉ ๋ @each ๊ฐ ๋ฐ๊ฒฌ๋๋ฉด ๊ฒฝ๊ณ ๋ฅผ ๋ฐํํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ค, ๋์ํฉ๋๋ค. ์ต์ํ ๊ฒฝ๊ณ ๋ฅผ ๋์ ธ์ผํฉ๋๋ค : +1 :
์ด๊ฒ์ ์๋ ์ด ์ง๋ ํ์๋ ์ฌ์ ํ ๋ฌธ์ ์ ๋๋ค. ๋ง์ต๋๊น? ์ง์๋๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
์, ํญ์ ๊ฐ ์์ค์์ ๊ณ์ฐ ๋ ์์ฑ์ ๊ตฌ์ถํ๊ณ ๊ฐ ์ปฌ๋ ์ ์ ๊ฐ ์์ฑ ๋์ ๊ณ์ฐ ๋ ์์ฑ์ ๊ด์ฐฐ ํ ์ ์์ต๋๋ค.
@ kingpin2k ๋๋
๋ค์์ ์์ ๋๋ค. http://emberjs.jsbin.com/faximekico/2/edit ๊ธฐ๋ณธ์ ์ผ๋ก ์ค๊ฐ ์์ค์์ ๊ฐ์ ์ง๊ณํด์ผํฉ๋๋ค.
๋๋ ๊ทธ๊ฒ์ํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ๊ณ ์์ฑ์ด ์คํ๋์ง ์์ผ๋ฏ๋ก ๊ด์ฐฐ์ ์ฌ์ฉํด์ผํ์ต๋๋ค.
์๋ฅผ ๋ณด์ฌ ์ฃผ์๊ฒ ์ต๋๊น? ์์ฑ์ ๋๋ฆฌ๊ฒ๋ก๋๋๋ฏ๋ก ์ค์ ๋ก ์์ฑ์ ๊ฐ์ ธ ์ค๋ ค๊ณ ํ์ง ์์ผ๋ฉด "์คํ"๋์ง ์์ต๋๋ค.
๋๋ ๋ฌธ์ ์ ์์ฑ์ ๊ฒ์ํ๊ธฐ ์ํด ๋ช ์์ ์ธ .get์ ํ ์ ์ด ์์์ง๋ง, ๊ทธ๊ฒ์ ๋ค์ด์ผํ๋ ๋ ๋ค๋ฅธ ๊ณ์ฐ ๋ ์์ฑ์ ๊ฐ์ง๊ณ ์์์ต๋๋ค. ํ ํ๋ฆฟ์์ ๋ช ์ ์ ์ผ๋ก ๊ฐ์ ธ ์ค๊ฑฐ๋ ์ฌ์ฉํ๋ ๊ฒ๋ง์ผ๋ก๋ ์คํ๋๊ณ ๋ค๋ฅธ ์์ฑ์ด ๊ด์ฐฐํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ง์ต๋๋ค. ์์ฑ์ ์์ฒญ์์๋ง ๊ณ์ฐ๋๋ฉฐ ์์ฑ์ ๋ณด๋ ๊ฒ๋ง์ผ๋ก ์์ฑ์ ๊ณ์ฐํด์ผํ๋ค๋ ์๋ฏธ๋ ์๋๋๋ค. ๋น์ฐํ ์๋ฌด๋ ์ฌ์ฐ์ ์ฌ์ฉํ๊ณ ์ถ์ง ์๋ค๋ฉด ์ฌ์ฐ์ ๊ณ์ฐํ ํ์๊ฐ ์์ต๋๋ค.
@ kingpin2k ๊ทธ๋์์ด ๊ฒฝ์ฐ ๊ถ์ฅ๋๋ ๊ฒ์ ๋ฌด์์ ๋๊น? ๋ ์ด์ ๊ด์ฐฐ์ ์ฌ์ฉํด์๋ ์๋ฉ๋๋ค.
๋ด ์์ ๋ ๊ด์ฐฐ์์์ด ์ค์ฒฉ ๋ ๊ฐ ์ข ์์ฑ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. ๊ด์ฐฐ์๋ฅผ ๋ ์ด์ ์ฌ์ฉํด์๋ ์๋๋ค๊ณ ๋งํ ์ฌ๋์ ๊ธฐ์ต ๋์ง ์์ง๋ง ์ข ๊ต์ ์ผ๋ก๋์ฃผ์๋ฅผ ๊ธฐ์ธ์ด์ง ์์ต๋๋ค.
@ kingpin2k ์์ ์์ .property('[email protected]')
์์ฑ์ ์ฌ์ฉํฉ๋๋ค.
๊ทธ๊ฒ์ ์ฌ์ฐ์ด๊ธฐ ๋๋ฌธ์ ๋ฐ์ฌ๋์ง ์๋ ๋์ผํ ๋ฌธ์ ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ทธ ์์ฑ์ ๊ด์ฐฐํด์ผํ๋ ๋ ๋ค๋ฅธ ์์ฑ์ด ์์ต๋๋ค.
@ rwwagner90 ์ ๊ทผ ๋ฐฉ์์ ํ์คํ ์๋ํฉ๋๋ค.์ด ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ ์ฝ๋์ ๋ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฌธ์ ๊ฐ ๋ฌด์์ธ์ง ํ์ ํ๊ธฐ ์ํด jsbin์ ๊ฒ์ ํด๋ณด์ญ์์ค.
๋๋ ๋น์ ์ด ์ป๋ ๊ฒ์ ์ดํดํ ์ ์์ต๋๋ค.
์ต์ ๋ฒ์ ๊ด๋ จํ์ฌ @ rwwagner90 ,
@alexspeller @ kingpin2k ๋ ๊ฐ์ง ์์ฑ์ด ์์ผ๋ฉฐ ํ๋๋ ๋ค๋ฅธ ์์ฑ์ด ๋ณ๊ฒฝ๋๋ฉด ๋ณ๊ฒฝํด์ผํฉ๋๋ค. ์์ฑ์ด ํ๊ฐ๋์ง ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ์ง ์์ผ๋ฏ๋ก ๋ ๋ฒ์งธ ์์ฑ์ ์ ๋ฐ์ดํธ๋์ง ์์ต๋๋ค.
@ rwwagner90 ์ ๋ค๋ฅธ ๋ณ๊ฒฝ ์ฌํญ์ด์์ ๋ ๋ณ๊ฒฝ๋๋ ํ๋์ ์์ฑ์ ๊ฐ๋ ๊ฒ์ด ๊ณ์ฐ ๋ ์์ฑ์ ํต์ฌ ๊ธฐ๋ฅ์ด๋ฏ๋ก ์ค๋ช ํ๋ ๋ด์ฉ์ด ํ์คํ์ง ์์ต๋๋ค. ์ฌ์ฉ์ค์ธ ์ฝ๋๋ฅผ ํ์ํ๋ฉด ๋๊ตฐ๊ฐ๊ฐ ๋์์ ์ค ์ ์์ต๋๋ค.
@alexspeller ๋๋ ๊ทธ๊ฒ์ ๋ชจ๋ ๊ด์ฐฐ์ ์ฌ์ฉํ์ฌ ๋ณํํ์ง๋ง ๊ทธ๊ฒ์ ๋ค์ ๋ฃ๊ณ ๋ณด์ฌ ๋๋ฆฌ๊ฒ ์ต๋๋ค.
let extendedObject = Ember.Object.extend({
valueLength: function() {
return this.get('value').length;
}.property('value.<strong i="7">@each</strong>')
});
๊ทธ๋ฐ ๋ค์ valueLength๊ฐ ์ํ ํ ๋ ์ ๋ฐ์ดํธํด์ผํ๋ ์์ฑ์ด ์์ต๋๋ค.
}.property('model.data.<strong i="11">@each</strong>', '[email protected]'),
๊ทธ๋ฌ๋ ์ด๊ฒ์ ๊ฒฐ์ฝ ๋ฐ์ํ์ง ์์ผ๋ฏ๋ก valueLength ์์ฑ์ ๋์ valueLength๋ฅผ ์ค์ ํ๋ ๊ด์ฐฐ์๋ก ๋ณ๊ฒฝํด์ผํ์ต๋๋ค.
let extendedObject = Ember.Object.extend({
valueLengthUpdater: function() {
this.set('valueLength', this.get('value').length);
}.observes('value.<strong i="15">@each</strong>')
});
@ rwwagner90 ์ข
์์ฑ ํค๊ฐ๋ฐ๋ ํญ๋ชฉ๊ณผ ์ผ์นํ์ง ์์ต๋๋ค. ์ข
์์ฑ ํค๋ model.data.length
์ด์ด์ผํฉ๋๋ค.
๋ํ [email protected]
๋ ๊ด์ฐฎ์ต๋๋ค. ๊ฐ์ ๊ณ์ฐํ ๋ ์ค์ ๋ก get ( 'valueLength')ํด์ผํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก CP์์ ' @each '๋ง์ผ๋ก ์ข
์์ฑ์ ์ข
๋ฃํ๋ ๊ฒฝ์ฐ ์ข์ ์๊ฐ์ ๊ฐ์ง ๋ชปํ๋ฉฐ ์ข
์์ฑ์ CP ๊ณ์ฐ์ ์ผ๋ถ๋ก ์๋นํด์ผํฉ๋๋ค. ํจ๊ป ๋ณ๊ฒฝ๋๋ ํญ๋ชฉ์ ๋ํด ์ถ์ธก ํ ์ ์์ต๋๋ค (ํญ๋ชฉ์ ๋ ๊ธฐ์ ์ผ๋ก ๋ฌดํจํ๋๊ณ ์์ฑ์ ์๋นํ๋ ๊ด์ฐฐ์๊ฐ ์์ผ๋ฉด ๊ฒฝ์ ์กฐ๊ฑด์ผ๋ก ์ด์ด์ง ์ ์์). ์ข
์์ฑ์ ๊ณ์ฐ ๋ ๊ฐ์ ๋ง๋๋ ๊ณผ์ ์์ ์ค์ ๋ก ์๋นํ๋ ๊ฒ๊ณผ ์ผ์นํด์ผํฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ๊ด์ฐฐ์๋ ์์ค์ด ๋ฎ๊ณ ์ ๋๋ก ์ดํดํ๊ธฐ ์ด๋ ต์ต๋๋ค. ์ค์ ๋ก ์์ ์ ์ํํ๋ฉด ์๋ฉ๋๋ค (๊ฒฝ์ ์กฐ๊ฑด, ์ง๋์น๊ฒ ๋น๋ฒํ ์ฌ ๊ณ์ฐ ๋ฑ์ผ๋ก ์ด์ด์ง ์ ์์). ๊ทธ๋ค์ ์ด๋ฒคํธ ํ๋ ์ ๋น ํ ๋ฒ๋ง ์์ ์ ์์ฝํด์ผํฉ๋๋ค.
Ditto @krisselden. ๋ํ ์ผ๋ถ ์ปจํธ๋กค๋ฌ์ ๋ชจ๋ธ์๋ extendedObject
์ ๋ชจ์ ์ธ data
์์ฑ์ด ์๊ณ ์ปจํธ๋กค๋ฌ์๋ ๊ณ์ฐ ๋ ์์ฑ์ด ์๊ณ extendedObject
์๋ ๊ธธ์ด ์์ฑ (๊ฐ์ฒด๊ฐ ์๋ ๋ฐฐ์ด์ด์ด์ผํ๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฌ์ง๋ง ๋ฌด์ํฉ๋๋ค.
something: function(){
// inside of here you should actually fetch `valueLength` off of each item, or else it isn't really a dependecy
// assuming data returns an array
var lengths = this.get('model.data').getEach('valueLength');
}.property('model.data.length', '[email protected]'),
ํธ์งํ๋ค:
valueLength
์์ฑ์ valueLength: Ember.computed.alias('value.length')
๋ฐ๊ฟ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ฉด ์ข ์ ํค๋ ๋ค์์ด๋ฉ๋๋ค.
}.property('[email protected]')
์ด์ ์ ์์ฑํ ๋ด์ฉ์ด ์๋ํ์ง ์๋ ์ด์ ์ ๋ํด์๋ ์๋ @krisselden ์ ์ค๋ช ์ ์ฐธ์กฐํ์ญ์์ค.
@ rwwagner90 valueLength๋ ๊ฑฐ๊ธฐ์ ํ์ํ์ง ์์ต๋๋ค.
}.property('[email protected]')
๋์ ์ถ๊ฐ ์์ฑ์์ด @each
ํ๋ฉด ์๋ฉ๋๋ค. ํญ๋ชฉ์ด ์ถ๊ฐ๋๊ฑฐ๋ ์ ๊ฑฐ๋๋์๊ธฐ๋ฅผ ๊ด์ฐฐํ๋ ค๋ฉด ๋์ somearray.[]
์ฌ์ฉํ์ญ์์ค. [email protected]
๋ฅผ ๊ด์ฐฐํ๋ฉด foo.[]
๋ ๊ด์ฐฐ ํ ํ์๊ฐ ์์ต๋๋ค.
@alexspeller ์ฌ์ค ๋น์ ์ ํ ์ ์์ต๋๋ค
@alexspeller get ( '@ each.value') ์ํ๊น๊ฒ๋ ์ถ๊ฐ ์ฐ๊ฒฐ์ ์ข ๋ฃํ๋ EachProxy๋ฅผ ๋ฐํํ๋ ๋์ ๊ฐ์ ๋ฐฐ์ด์ ๋ฐํํฉ๋๋ค. ์ ๊ทธ๋ ๊ฒ๋์๋์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง semver๊ฐ ์ฃผ์ด ์ก์ ๋ ๋ณ๊ฒฝํ ์ ์์์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์์งํ์ด ๊ธฐ๋ฅ์ ํ์ฑํํ๋ ๊ฒ์ด ๊ธด์ฅ๋ฉ๋๋ค.
์๊ฑฑ ๊ฑฐ๋ฆฌ๋ ๋ฐํด๋ ๊ธฐ๋ฆ์ ์ป์ต๋๋ค. ๋ถ์จ ๊ณต๋์ฒด์ ๋ ๋ง์ ๋ถ๋ถ์ ์ํฅ์ ๋ฏธ์น๊ธฐ ์ ๊น์ง๋ ์ฐ์ ์์๊ฐ ์ง์ ๋์ง ์์ ๊ฒ์ ๋๋ค. ๊ณต๋์ฒด์ 90 %๋ฅผ ๋๋ ๋ค๋ฅธ ๋ฎ์ ๋งค๋ฌ๋ฆฐ ๊ณผ์ผ์ด ๋ง์ด ์์ต๋๋ค.
@alexspeller Ember.computed.alias๊ฐ ์๋ํ์ต๋๋ค. ๊ฐ์ฌ! : +1 :
@krisselden Chaining @each
๊ต์ฅ ํ ๊ฒ์ด์ง๋ง ์ง๋ ๋ช ๋
๋์ ์๋ฌด๋์ด ๋ฌธ์ ๋ฅผ ๋ค๋ฃจ์ง ์์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ด ๊ฒ ๊ฐ์ง ์์ต๋๋ค.
๋๋์ด ๋ฌธ์ ๋ฅผ ์ด๋์ ๊ฒ์ ํด์ผํ ์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์์ด ๋ฌธ์ ๊ฐ ์ฌ์ ํ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
Ember 2.1.0 + 45f524a3์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
๊ด์ฐฐ์๊ฐ ํด๊ณ ๋นํ์ต๋๋ค.
var o = Ember.Object.create({
a: [{ b: 1 }, {b: 2} ]
})
Ember.addObserver(o, '[email protected]', o, function () {
console.log("FIRE")
});
Ember.set(o.a[0], 'b', 3)
ํ์ง๋ง ์ด๊ฒ์ผ๋ก๋ ์๋ฌด ์ผ๋ ์ผ์ด๋์ง ์์ต๋๋ค
var o = Ember.Object.create({
A: [{ b: 1 }, {b: 2} ]
})
Ember.addObserver(o, '[email protected]', o, function () {
console.log("FIRE")
});
Ember.set(o.A[0], 'b', 3)
(๋ค๋ฅธ ์ ์ ์์ฑ ์ด๋ฆ "a"์ "A"์ ๊ฒฝ์ฐ์ ๋๋ค.)
๋ฐ๋ผ์ ๋๊ตฌ๋์ด ๋ฌธ์ ๋ฅผ ์ธ์ํ๊ณ ์ค๋ช ์ ๋์์ฃผ์ธ์. ๊ฐ์ฌ.
๊ฐ์ฌ. ํ์ง๋ง ์๋ฌธ์ "a"๋ก ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค.
var o = Ember.Object.create({
a: [{ b: 1 }, {b: 2} ]
})
Ember.addObserver(o, '[email protected]', o, function () {
console.log("FIRE")
});
Ember.set(o.a[0], 'b', 3)
๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์๋ ๊ณ์ฐ ๋ ์์ฑ์ด ์์ต๋๋ค.
์, ๋๋ฌธ์ a๋ ์ง์๋์ง ์์ต๋๋ค. ์๋ฌธ์๋ก ์์ํ๋ ์์ฑ ์ด๋ฆ์ ์ฌ์ฉํฉ๋๋ค.
๊ฐ์ฌ,
์ด๊ฒ์ ๋๋ฌธ์ ์ด๋ฆ๊ณผ ". @ each"๋ก ๋ฐ์ํฉ๋๋ค.
๊ฐ๋จํ ์์ฑ์ผ๋ก ๊ด์ฐฎ์ต๋๋ค. ์ด๋ ๊ฒ :
var o = Ember.Object.create({
A: 1
})
Ember.addObserver(o, 'A', o, function () {
console.log("FIRE")
});
Ember.set(o, 'A', 3)
๋๋ ๊ทธ๊ฒ์ ๋ํ ๋ฌธ์๋ฅผ ์ด๋์๋ ์ฐพ์ ์ ์์ต๋๋ค.
๋๋ ๋๋ฌธ์๋ก ๋ช
๋ช
๋ ์์ฑ์ ๋ํด ๋ง์ ์๋ฌธ์ ๋ณ์นญ์ผ๋ก ๋๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ญ์ฌ์ ์ผ๋ก (2.0 ์ด์ ), ๋๋ฌธ์๋ก ํ์๋ ๊ฒฝ๋ก๋ ์ ์ญ์ ๋ํ๋
๋๋ค (๋ฐ๋ผ์ ๊ทํ์ ๊ฒฝ์ฐ์๋ window.A
๊ด์ฐฐํฉ๋๋ค). ์ด ๋ฌธ์ ๋ ๊ทํ์ ์๊ฒฌ์ด ๋
ผ์ํ์ง ์๋ @each์ ์ค์ฒฉ ๊ฒฝ๋ก์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค.
๋๋ฌธ์ ๊ฒฝ๋ก์ ํน์ ์ผ์ด์ค ๋๋ถ๋ถ (๋ชจ๋)์ ์ ๊ฑฐํด์ผํฉ๋๋ค. 2.8.1์ ๋ํด ํ ์คํธํด์ผํฉ๋๋ค. 2.8์์ ์ฌ์ ํ ์๋ํ์ง ์์ผ๋ฉด twiddle / jsbin ๋ณต์ ๋ก ์๋ก์ด ๋ฌธ์ ๋ฅผ์ฌ์ญ์์ค.
์ด๊ฒ์ ๋งค์ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌํ๊ฒ๋ ๋๋ฝ ๋ ๊ธฐ๋ฅ์ ๋๋ค. ์ด๋ฌํ ๋ชจ๋ ์ข ์๋ฆฌ์ ํํ๋์ ํ๋ ์ ์ํฌ์ ์ถ๊ฐํ๊ธฐ ์ ์ ๊ธฐ๋ณธ ์ฌํญ์ ํ์ ํ๋ ๋ฐ ์ง์คํ๋ ๊ฒ์ด ๋์์ด ๋ ๊ฒ์ ๋๋ค.
@timothyerwin ์ค์ ๋ก์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ ๋งค์ฐ ์ฝ์ต๋๋ค. ๋ํ ์ง๊ธ์ด ์ด๊ฒ์ ๋ฐ๊พธ๊ธฐ์๋ ๋์ ์๊ฐ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ' @tracked'im glimmer show์ ๊ฐ์ด ์ฅ๊ธฐ์ ์ผ๋ก CP ์ ์ฒด๋ฅผ ๋ค์ ์๊ฐํด์ผํฉ๋๋ค. ๋ํ ์คํดํ์ง ๋ง์ญ์์ค. ๊ฐ๋ ์ด๊ฒ์ ๊ฐ๊ณ ์ถ์ต๋๋ค!
์ด๊ฒ์ ์ต๊ทผ์ ๊ฐ์ฅ ์์ฃผ ์ ํ๋ Ember ๋ฌธ์ ์ ๋๋ค. ์ข ์ข ์ค์ฒฉ ๋ ์์ฑ์ด์๋ @each ์ธ ์ข ์ ํค๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์์ฑํ๋ ๊ฒ์ ์๊ธฐ ์ฌ์ด ํํฐ ๋๋ ์ ๋ ฌ CP ๋งคํฌ๋ก์ ๊ฐ์ ๋ค๋ฅธ ๊ฒ ๋ค์ ์จ๊ฒจ์ ธ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
@luxferresum ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ์ ๋ณด์ ๋ํ ๋งํฌ๋ฅผ ๊ฒ์ ํด ์ฃผ์๊ฒ ์ต๋๊น? ๋น์ฐํ ๋๋ ์ด๊ฒ์ ๋ฐ๋ณต์ ์ผ๋ก ๋นํฉํ๊ณ , ์ปค๋ฎค๋ํฐ ์ฌ๋ ๋์๋ง ์ฑ๋์ ํตํด ๋ช ๊ฐ์ง ํํธ๋ฅผ ๋ฐ์์์ ์๊ณ ์์ง๋ง ๊ธฐ์ต์ด ๋์ง ์์ผ๋ฉฐ ์น ๊ฒ์์์ ์ข์ ๊ฒ์๋ฌผ์ ์ฐพ์ ์์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์๋ง๋ ํธ๋ฆญ์ ๊ฐ ๋ ๋ฒจ์ ์์ฒด ๊ณ์ฐ ๋ ์์ฑ์ผ๋ก ์ด๋ป๊ฒ ๋ ๋๋๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ฐ๋ผ์ traces: [{ x: [...], y: [...]}, ...]
์ ๊ฐ์ ๋ฐฐ์ด์ด ์๊ณ (ํ์ฉ๋์ง ์์) ํค traces.@each.{x,y}.[]
(๋ฅผ) ๊ธฐ๋ฐ์ผ๋ก ์
๋ฐ์ดํธํ๋๋ก ์ธ๋ถ ์ฐจํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ ค๋ฉด ์ด๋ ๊ฒ ํ๋ฉดํํ ๊น์?
// Not only is this ugly, but it doesn't work since `_oneBigMess` won't get
// called again when something in one of its nested arrays changes,
// e.g. Changing traces[0].x[0] does not trigger 'traces.[]'
_oneBigMess: computed('traces.[]', function() {
return this.get('traces').reduce(function(result, item, i, a) {
return {
x: result.x.concat(item.x),
y: result.x.concat(item.y)
};
}, { x: [], y: []})
}),
_somethingChanged: observer('_oneBigMess.x.[]', '_oneBigMess.y.[]', function() {
// update chart
})
์์ ์ฝ๋๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๋๊ตฌ์ ๋ํด ๋ ๊ฒฝํ์ด ๋ง๊ณ ์ต์ํ ์ฌ๋์๊ฒ๋ ์ด๋ฆฌ์์ ์ผ์ด๋ผ๊ณ ํ์ ํ์ง๋ง ์ฌ๊ธฐ์์๋ ๋นจ๋๋ฅผ ํ์ ํ๊ณ ์์ต๋๋ค.
ํ์ง๋ง ๋ด๊ฐ ์ค๋ช ํ ์ํฉ์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด์๋ ๊ฒ ๊ฐ์ต๋๋ค ๐ข
์ ๋ฐ์ดํธ : ๋ด๊ฐ ํ๋ ธ๋ค๋ฉด ๋๊ตฐ๊ฐ ๋๋ฅผ ๊ณ ์ณ์ฃผ์ธ์.ํ์ง๋ง ์ค๋ ๋ฐค ์ด๊ฒ์ผ๋ก ์ ์ ์ธ์ด ํ์ ์ฌ๊ธฐ์ ๋ฌธ์ ๋ ๋ ๋ง์ ๊ตฌ๋ฌธ ์คํ์ ์ ๊ณตํ๋ ๊ฒ์ด ์๋๋ผ ์ค์ ๋ก ํ์ฌ ์์คํ ์ ํ๊ณ์ ๊ดํ ๊ฒ ๊ฐ์ต๋๋ค. ๋ด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ค๋ฉด ( ์์ ์ด์ ๋๊ธ ๊ณผ ์ผ๋ถ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก)์ด ๊ธฐ๋ฅ์ ํจ์จ์ ์ด๊ณ ๊นจ๋ํ ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์ ์์ง ์ ๊ณต๋์ง ์์ต๋๋ค. ๋ด๊ฐ๋ฐ์ ์ถฉ๊ณ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๊ฒ์ํ์ง ์๊ณ ์คํ๋ ค ํ์ํ์ง ์๋๋ก ๋ด ์ฝ๋์ ๋์์ธ์ ๋ณ๊ฒฝํ๋ผ๋ ๊ฒ์ด์๋ค. ์ด๊ฒ์ ์๋ง๋ ์ข์ ์กฐ์ธ์ด์ง๋ง ๋๋ก๋ ์คํ ๊ฐ๋ฅํ์ง ์์ ์๋ ์์ต๋๋ค (์ : ๋ถ์ถฉ๋ถ ํ ์๊ฐ ๋๋ ํต์ ํ ์์๋ ์๊ตฌ ์ฌํญ). 2 ๋จ๊ณ์ ๊ฒฝ์ฐ ํ ๊ฐ์ง (๋งค์ฐ ๋์ฐํ๊ณ ๋นํจ์จ์ ์ธ) ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ฐ๊ฐ ๋ฐฐ์ด์ ๋จ์ผ ์์์ ์ฐ๊ฒฐ๋ ๊ธด (์ฝ๋๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋ ๋ฐ ํ์ํ ์ต๋ ๋ฐ์ดํฐ ํฌ๊ธฐ) ๋ชฉ๋ก์ ์์ฑํ๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค๋ฉด :
_watchChanges: observer('data.[]', 'data.@each.{name,type}',
...(new Array(100).fill(0).map((z,i) => `data.${i}.x.[]`)),
...(new Array(100).fill(0).map((z,i) => `data.${i}.y.[]`)), function() {
// something in one of these arrays has changed --> go do something
})
๋ ๋ค๋ฅธ ๊ฐ๋ฅ์ฑ (๋ด๊ฐ ์๋ํ์ง ์์๊ณ ์ฌ์ ํ ์ด์์ ์ด์ง๋ ์์)์ ์ต์์ ๋ฐฐ์ด์ ๋ฐ๋ณตํ๊ณ addArrayObserver
๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ์ค์ฒฉ ๋ฐฐ์ด์ ํ์ธํ ๋ค์ ๋์ค์ removeArrayObserver
๋์ถ์ ๋ฐฉ์งํ๊ธฐ ์ํด).
@jacobq
์คํ๋ ค ๋ด ์ฝ๋์ ๋์์ธ์ ๋ณ๊ฒฝ
์ง์ค. ๊ทธ๋ฌ๋ ๋น์ ์ด ์ ์ํ๋ ๊ฒ๋ณด๋ค ์ด๊ฒ์ ์ฒ๋ฆฌํ๋ ๋ ์ฌ์ด ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ x
๋ฐ ๋ชจ๋ y
์ ๋ชฉ๋ก์ ๊ฐ์ ธ ์ค๋ ค๋ traces: [{ x: [...], y: [...]}, ...]
๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ์๋ ์์ ๋ก ๋ณด์ฌ ๋๋ฆฌ๊ฒ ์ต๋๋ค.
์ฌ๊ธฐ์ ์ฃผ์ ํธ๋ฆญ / ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ฐ ์ถ์ ์ ๋ถ์จ ๊ฐ์ฒด๋ก ๋ณํ ํ ๋ค์ x.[]
๋ฐ y.[]
์ข
์์ฑ ํค๋ฅผ ์ฌ์ฉํ์ฌ Trace
์ CP๋ฅผ ๊ฐ๋ ๊ฒ์
๋๋ค. ์ด CP๋ x
/ y
๋ฐฐ์ด์์ ๋ฌด์ธ๊ฐ ์ถ๊ฐ / ์ ๊ฑฐ ๋ ๋๋ง๋ค ์คํ๋ฉ๋๋ค. ๋ค์์ผ๋ก [email protected]
๋ฅผ ์ข
์์ฑ ํค๋ก ์ฌ์ฉํ๋ ๊ฐ๋จํ CP๋ฅผ ์ ๊ณต ํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ traces
๋ ember Trace
๊ฐ์ฒด ๋ชฉ๋ก์ด๊ณ myProp
๋ CP์
๋๋ค. ๋ฐฉ๊ธ ์๊ธฐ ํ์ด.
๋๋ ์ฝ๋ :
const Trace = Ember.Object.extend({
wrapped: Ember.computed('x.[]', 'y.[]', {
get() {
return {
x: this.get('x'),
y: this.get('y'),
}
}
}),
});
export default Ember.Component.extend({
traces: null,
tracesAsEmberObjects('traces.[]', {
get() {
this.get('traces').map(t => Trace.create(t));
}
}),
oneBigMess: Ember.computed('[email protected]', {
get() {
return this.get('tracesAsEmberObjects').reduce((result, item, i, a) => {
return {
x: result.x.concat(item.x),
y: result.x.concat(item.y)
};
}, {x:[], y:[]});
}
}),
});
์ค์ ๋ก wrapped
๋ฐํํ๋ ๊ฒ์ด ๋ฌด์์ธ์ง๋ ์ค์ํ์ง ์์ต๋๋ค. ์ฌ๋ฐ๋ฅธ ์ข
์์ฑ ํค๊ฐ ์์ผ๋ฉด .get()
๊ทธ๊ฒ์ ์ธ๋ถ CP์ [email protected]
์ข
์์ฑ ํค๋ก ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ์ ์ฉํ ๊ฒ์ ๋ฐํํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค.
@luxferresum ์๊ฐ์๋ด์ด ์ ์ฌ์ ์ธ ํด๊ฒฐ์ฑ
์ผ๋ก ๋ต์ฅ ํด ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋์ผํ ๋ฌธ์ ๊ฐ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ณ์ฐ ๋ ์์ฑ์ผ๋ก ์๋ก์ด EmberObject
๋ฅผ ์์ฑํ๋ฉด ํด๋น ๊ฐ์ฒด๊ฐ ๋ณด์ ํ ๋ฐฐ์ด์ ๋ณ๊ฒฝ์ ๋ฐ์ ํ ์ ์์ง๋ง ํด๋น ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ณผ์ ์ ์๋ณธ ๋ฐ์ดํฐ ์ ๋ณต์ฌ๋ณธ ์
์๋ฅผ ๋ค์ด, ember-cli-plotly ์ ๋์จ์์ ํ๋กฏ ํ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝ ํ๋ ํตํฉ ํ ์คํธ ๋ฅผ ๋ง๋ค๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์์ผ๋ฉฐ ์ฃผ์ ๊ตฌ์ฑ ์์ ๊ฐ ํ๊ทธ์๋ ํ์ ๊ตฌ์ฑ ์์๋ฅผ ์๋ ํฉ๋๋ค. ๊ฐ ์ถ์ ์ ๋ํด ์ค์ ํ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ ๋ ๋ ์์ ์ ์คํ ํฉ๋๋ค.
๋ด๊ฐ ๋ญ๊ฐ ์๋ชปํ๊ณ ์๋ ๊ฒฝ์ฐ๋ฅผ ๋๋นํด์ ์กฐ๊ธ ๋ ์๋ํด ๋ณผ๊ฒ์ (๊ฐ๋ฅํ๋ฉด).ํ์ง๋ง ์ง๊ธ์ ํ๋ ๋ฐฉ์์ ๋น์ ์ด ์ ์ํ ๊ฒ๋ง ํผ ๊ฐ๋จํ์ง ์๋ค๊ณ ์๊ฐํ๊ฒ ๋ง๋ญ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๊ด์ฐฐํ๋ ค๋ ๋งค์ฐ ์ค์ฒฉ ๋ ๊ฐ์ฒด ๋ง ํฌํจํ๋ ์๋ก์ด ๊ณ์ฐ ๋ ์์ฑ์ ์ถ๊ฐ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ @each ๋ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํฉ๋๋ค.
๋ค์ ๋ฐฉ๋ฒ ์ฌ์ฉ
๋์ ์