рдПрдореНрдмрд░ рдСрдХреНрдЯреЗрди рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рджрд┐рдЦрд╛рдИ рджреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЯреНрд░реИрдХрд┐рдВрдЧ (рдСрдЯреЛрдЯреНрд░реИрдХрд┐рдВрдЧ) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд░реЛрдорд╛рдВрдЪрдХ рдирд╣реАрдВ рд╣реИ ред рдСрдЯреЛ рдЯреНрд░реИрдХрд┐рдВрдЧ рдПрдореНрдмрд░ рдХреА рдирдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рдгрд╛рд▓реА рд╣реИ, рдЬреЛ рдПрдореНрдмрд░ рдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ рдХрд┐ рд░рд╛рдЬреНрдп рдХреЗ рдорд╛рди (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЪрд┐рд╣реНрдирд┐рдд рдЧреБрдг @tracked
) рдмрджрд▓ рдЧрдП рд╣реИрдВред рдпрд╣ рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рдПрдХ рдмрдбрд╝рд╛ рдЕрджреНрдпрддрди рдерд╛, рдЬрд┐рд╕рдореЗрдВ рдирдП рдХрд░реНрдиреЗрд▓ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдХреБрдЫ рд╕рдмрд╕реЗ рдкреБрд░рд╛рдиреЗ рдПрдореНрдмрд░ рдЕрдореВрд░реНрдд рдХрд╛ рдкреВрд░рд╛ рдкреБрдирд░реНрд▓реЗрдЦрди рд╢рд╛рдорд┐рд▓ рдерд╛ред
рдПрдХ рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ: рдХреНрд░рд┐рд╕ рдЧреИрд░реЗрдЯ - рд▓рд┐рдВрдХреНрдбрдЗрди рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдореНрдмрд░ рдЬреЗрдПрд╕ рдврд╛рдВрдЪреЗ рдореЗрдВ рдореБрдЦреНрдп рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдЙрдиреНрд╣реЛрдВрдиреЗ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг - рдПрдореНрдмрд░ рдСрдХреНрдЯреЗрди рдХреЛ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд░рд┐рдп рднрд╛рдЧ рд▓рд┐рдпрд╛ред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдЙрдирдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдПрдореНрдмрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦреА рдЧрдИ рдереА, рдпрд╣ рдЙрди рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдкрд░ рдЫреВрддреА рд╣реИ рдЬреЛ рд╕рднреА рд╡реЗрдм рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИрдВред
рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рдСрдЯреЛ рдЯреНрд░реИрдХрд┐рдВрдЧ, рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЙрдбрд▓ Ember Classic
(рдЧрдгрдирд╛ рдХреА рдЧрдИ рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ, рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХреЛрдВ рдФрд░ Ember.set()
) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрд╣реБрдд рд╕рдорд╛рди рд╣реИ ред рдпрджрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рджреЛ рддрд░рдл рд╕реЗ рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореБрдЦреНрдп рдЕрдВрддрд░ рд╡рд╣ рд╣реИ рдЬрд╣рд╛рдВ рдПрдиреЛрдЯреЗрд╢рди рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдСрдХреНрдЯреЗрди рдореЗрдВ, рдЖрдк рдЙрди рдЧреБрдгреЛрдВ рдХреЛ рдПрдиреЛрдЯреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рди рдкрд░ рдЖрдк рдирд┐рд░реНрднрд░ рд╣реИрдВ, рдЬрдмрдХрд┐ рдХреНрд▓рд╛рд╕рд┐рдХ рдореЗрдВ, рдЖрдк рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░реНрд╕ рдХреЛ рдПрдиреЛрдЯреЗрдЯ рдХрд░рддреЗ рд╣реИрдВред
class OctaneGreeter {
@tracked name = 'Liz';
get greeting() {
return `Hi, ${this.name}!`;
}
}
class ClassicGreeter {
name = 'Liz';
@computed('name')
get greeting() {
return `Hi, ${this.name}!`;
}
}
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЦреБрджрд╛рдИ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдкрд╛рдПрдВрдЧреЗ рдХрд┐ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЯреНрд░реИрдХрд┐рдВрдЧ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реА рдФрд░ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ , рдЬреЛ рдПрдореНрдмрд░ рдХреНрд▓рд╛рд╕рд┐рдХ рдореЗрдВ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд╛рдзрд╛рд░рдг 2d рд╡реАрдбрд┐рдпреЛ рдЧреЗрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбрд▓ рд▓реЗрдВ:
class Tile {
@tracked type;
constructor(type) {
this.type = type;
}
}
class Character {
@tracked x = 0;
@tracked y = 0;
}
class WorldMap {
@tracked character = new Character();
tiles = [
[new Tile('hills'), new Tile('beach'), new Tile('ocean')],
[new Tile('hills'), new Tile('beach'), new Tile('ocean')]
[new Tile('beach'), new Tile('ocean'), new Tile('reef')],
];
getType(x, y) {
return this.tiles[x][y].type;
}
get isSwimming() {
let { x, y } = this.character;
return this.getType(x, y) === 'ocean';
}
}
, isSwimming
, character
( x / y). , , getType
, . CP (. .: Computed Properties тАФ Ember Classics), - . .
, Ember Classic. ! , , Ember , Octane.
-, , . , . , . , , , , .
7 . , ┬л ┬╗, , :
- ? тЖР
- ?
- тАФ TrackedMap
- тАФ @localCopy
- тАФ RemoteData
- тАФ effect()
, , Octane. -, , , ! Discord.
: ┬л┬╗?
, ┬л ┬╗, , . . , .
: .
┬л┬╗ , ┬л ┬╗ ┬л ┬╗. , ┬л Ember┬╗ ┬л Vue┬╗, , . , .
, ! .

( (streams))
, , , , : ┬л┬╗ (declarative) ┬л┬╗ (state). ┬л ┬╗ , ┬л┬╗ ┬л┬╗ ? "" (state)? , , .
(state)
┬л┬╗ ┬л┬╗. , , ; , "". JavaScript :
, (root state), , . , , , . :
let a = 1;
let b = 2;
function aPlusB() {
return a + b;
}
aPlusB()
, a
b
. , . , , a
b
, aPlusB()
. , a
b
, aPlusB()
, .
, ┬л┬╗, ┬л┬╗ ┬л┬╗, , , . , :
, , , .
, - .
┬л┬╗ , (). , тАФ ┬л ┬╗? , , , , , , , ( , ).
aPlusB
. , , :
- ( ).
a + b
.
let a = 1;
let b = 2;
let aPlusB = a + b;
, , . , a
b
. aPlusB
, :
let a = 1;
let b = 2;
let aPlusB = a + b;
a = 4;
aPlusB = a + b;
b = 7;
aPlusB = a + b;
, . , a
, aPlusB
. API , , :
export default class Counter extends Component {
count = 0;
@action
incrementCount() {
this.count++;
this.rerender();
}
}
, rerender()
, , . , , - , , .
, ┬л┬╗ . aPlusB()
.
let a = 1;
let b = 2;
function aPlusB() {
return a + b;
}
, , , . , ┬л┬╗ , . , aPlusB()
, . , , , .
, , Ember, Vue Svelte, (, ) JSX , , JSX . HTML тАФ , , , . HTML, , . ┬л┬╗ , , , DOM, , DOM , .
FP (Functional Programming)?
. ┬л┬╗ ┬л┬╗ ┬л┬╗. , . , HTML, , - , .
( FP), . ┬л┬╗ тАФ .
let a = 1;
let b = 2;
function plus(first, second) {
return first + second;
}
plus(a, b);
. , , .

, ( ). , FP , , , . , , , .
, . , , , .
, , . , ┬л┬╗ FP, - (, , . ┬л ┬╗, !). , .
, :
- ┬л┬╗ ┬л ┬╗. , , , .
- ┬л┬╗ , . ( , ):
- ┬л ┬╗ , , , . HTML , тАФ , . , , .
. , , , - , - . , , ┬л┬╗ .
: , . , , )