Ember.js: @each๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด์˜ ์ค‘์ฒฉ ์†์„ฑ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ด€์ฐฐ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2012๋…„ 02์›” 27์ผ  ยท  75์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: emberjs/ember.js

์ปฌ๋ ‰์…˜ ๋‚ด ๊ฐœ์ฒด์˜ ์ค‘์ฒฉ ์†์„ฑ์— ๊ด€์ฐฐ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์•ˆ์ •์ ์œผ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์„ค๋ช…ํ•˜๋Š” 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 ๋Š” ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
๋‹ค์Œ ๋ฐฉ๋ฒ• ์‚ฌ์šฉ

  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')

๋ชจ๋“  75 ๋Œ“๊ธ€

@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 ํ‘œ์‹œ :

https://gist.github.com/meelash/5785328

์ด๊ฒƒ์ด 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 ์• ๋“œ์˜จ์—์„œ ํ”Œ๋กฏ ํ•  ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝ ํ•˜๋Š” ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ ๊ฐ€ ํƒœ๊ทธ์—†๋Š” ํ•˜์œ„ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ž‘๋™ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์ถ”์  ์— ๋Œ€ํ•ด ์„ค์ • ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ ๋  ๋•Œ ์ž‘์—…์„ ์‹คํ–‰ ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ญ”๊ฐ€ ์ž˜๋ชปํ•˜๊ณ ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•ด์„œ ์กฐ๊ธˆ ๋” ์‹œ๋„ํ•ด ๋ณผ๊ฒŒ์š” (๊ฐ€๋Šฅํ•˜๋ฉด).ํ•˜์ง€๋งŒ ์ง€๊ธˆ์˜ ํ–‰๋™ ๋ฐฉ์‹์€ ๋‹น์‹ ์ด ์ œ์•ˆํ•œ ๊ฒƒ๋งŒ ํผ ๊ฐ„๋‹จํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰