рдиреЙрдХрдЖрдЙрдЯJS: рдлреНрд▓рд╛рдИ рдкрд░ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдирд╛

рдкрд┐рдЫрд▓реЗ рд╢рдирд┐рд╡рд╛рд░ рдХреЛ, рдореБрдЭреЗ Dneporpetrovsk рдореЗрдВ .NET рд╢рдирд┐рд╡рд╛рд░ рдХреЛ MVVM рдФрд░ KnockoutJS рдкрд░ рдПрдХ рд░рд┐рдкреЛрд░реНрдЯ рдкрдврд╝рдиреЗ рдХрд╛ рд╕рдореНрдорд╛рди рдорд┐рд▓рд╛ ред
рд░рд┐рдкреЛрд░реНрдЯ рдХреЛ рдЬрдирддрд╛ рдиреЗ рдмрд╣реБрдд рдЧрд░реНрдордЬреЛрд╢реА рд╕реЗ рджреЗрдЦрд╛ рдФрд░ рдХрдИ рджрд┐рд▓рдЪрд╕реНрдк рд╕рд╡рд╛рд▓ рдХрд┐рдП,
рдЬрд┐рд╕рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рджреМрд░рд╛рди рд╣реА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВрдиреЗ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЬрд╡рд╛рдм рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИред

рдЖрдЬ рдореИрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ-рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреВрдВрдЧрд╛ред "рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдореБрдЭреЗ рд╕рднреА рд░рд┐рдХреЙрд░реНрдбреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдХреБрдЫ рд╢рд░реНрддреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИрдВред"

рдЗрд╕рдХрд╛ рдЬрд╡рд╛рдм рд╣реИрдмрд░рд╛рдд рдореЗрдВ рд╣реИред


рдореИрдВ MVVM рдФрд░ рдиреЙрдХрдЖрдЙрдЯJS рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред рдПрдХ рд╣рдмреНрд░ рдкрд░ рдЖрдк рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдореЗрд░реА рд░рд┐рдкреЛрд░реНрдЯ рд╕реЗ рдПрдХ рд╡реАрдбрд┐рдпреЛ рднреА рд╣реЛрдЧрд╛ред

рддреЛ, рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдХрд╛рд░реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ - рдХреЗрд╡рд▓ рд▓реЛрдЧреЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдкреБрд░реБрд╖реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдХреЛрдб рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдмрд╕ рд▓реЛрдЧреЛрдВ рдХреА рд╕реВрдЪреА рдФрд░ рдЙрдирдХреЗ рд▓рд┐рдВрдЧ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ ( рдХрд╛рдо рдХреЛ рд▓рд╛рдЗрд╡ рджреЗрдЦреЗрдВ )

ViewModel

var Person = function(gender, name) { this.gender = ko.observable(gender); this.name = ko.observable(name); }; var viewModel = { persons: ko.observableArray([ new Person('M', 'John Smith'), new Person('M', 'Mr. Sanderson'), new Person('F', 'Mrs. Sanderson'), new Person('M', 'Agent Ralf'), new Person('F', 'Gangretta Peterson') ]) }; ko.applyBindings(viewModel); 


рд░рд╛рдп

 <script type="text/html" id="PersonInfo"> <li> <span data-bind="text: gender"></span> <span data-bind="text: name"></span> </li> </script> <div data-bind=" template: { name: 'PersonInfo', foreach: persons}"></div> 


рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рдмрдВрдзрди рдореЗрдВ рд╕реАрдзреЗ рд╕рд░рдгреА рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдирд╛ рд╣реИред рдпрд╣ рдлреЙрд░реНрдЪ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 foreach: ko.utils.arrayFilter( persons(), function(p){ return p.gender() == 'M';} ) 


рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдФрд░ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдмрджрд▓рддреЗ рд╕рдордп, рд╕реВрдЪреА рдХреЛ рдЕрджреНрдпрддрд┐рдд рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдПрдХ рдкреВрд░реНрдг rerendering рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдирдП рдЖрдЗрдЯрдо рдЬреЛрдбрд╝реЗ рдЬрд╛рдПрдВрдЧреЗ, рдФрд░ рд╣рдЯрд╛рдП рдЧрдП рдЖрдЗрдЯрдо рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рдХрд╛рдо рджреЗрдЦреЗрдВ ред

рддреЛ, рдиреАрдЪреЗ рд╣рдорд╛рд░реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХреЛрдб:

ViewModel

 var Person = function(gender, name) { this.gender = ko.observable(gender); this.name = ko.observable(name); }; var viewModel = { persons: ko.observableArray([ new Person('M', 'John Smith'), new Person('M', 'Mr. Sanderson'), new Person('F', 'Mrs. Sanderson'), new Person('M', 'Agent Ralf'), new Person('F', 'Gangretta Peterson') ]), addMale: function() { this.persons.push(new Person('M', 'New male')); }, addFemale: function() { this.persons.push(new Person('F', 'New female')); }, removePerson: function(person) { this.persons.remove(person); } }; ko.applyBindings(viewModel); рд╢реНрд░реАрдорддреА рд╕реИрдВрдбрд░рд╕рди'), var Person = function(gender, name) { this.gender = ko.observable(gender); this.name = ko.observable(name); }; var viewModel = { persons: ko.observableArray([ new Person('M', 'John Smith'), new Person('M', 'Mr. Sanderson'), new Person('F', 'Mrs. Sanderson'), new Person('M', 'Agent Ralf'), new Person('F', 'Gangretta Peterson') ]), addMale: function() { this.persons.push(new Person('M', 'New male')); }, addFemale: function() { this.persons.push(new Person('F', 'New female')); }, removePerson: function(person) { this.persons.remove(person); } }; ko.applyBindings(viewModel); рдПрдЬреЗрдВрдЯ рд░рд╛рд▓реНрдл'), var Person = function(gender, name) { this.gender = ko.observable(gender); this.name = ko.observable(name); }; var viewModel = { persons: ko.observableArray([ new Person('M', 'John Smith'), new Person('M', 'Mr. Sanderson'), new Person('F', 'Mrs. Sanderson'), new Person('M', 'Agent Ralf'), new Person('F', 'Gangretta Peterson') ]), addMale: function() { this.persons.push(new Person('M', 'New male')); }, addFemale: function() { this.persons.push(new Person('F', 'New female')); }, removePerson: function(person) { this.persons.remove(person); } }; ko.applyBindings(viewModel); 


рдФрд░ рдмрд╣реБрдд рд╡рд┐рдЪрд╛рд░:

рд░рд╛рдп

 <script type="text/html" id="PersonInfo"> <li> <span data-bind="text: gender"></span> <span data-bind="text: name"></span> <small data-bind="text: new Date()"></small> <a href="#remove" data-bind="click: function() { viewModel.removePerson($data); }">x</a> </li> </script> <div data-bind=" template: { name: 'PersonInfo', foreach: ko.utils.arrayFilter( persons(), function(p){ return p.gender() == 'M';} )}"></div> <a href="#add-male" data-bind="click: addMale">Add male</a> <a href="#add-male" data-bind="click: addFemale">Add female</a> 


рдЕрдм, рдпрджрд┐ рдЖрдк рд╡рд┐рдЪрд╛рд░ рдХреЛ рдЪрд╛рд▓реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдордиреЗ рдХрд╛рдХреВ рд▓рд┐рдЦрд╛ рдерд╛ред рд╣рдо рдкреНрд░рд╕реНрддреБрддрд┐ рддрд░реНрдХ рдФрд░ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП MVVM рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЙрд╕реА рд╕рдордп рд╣рдо рд╡реНрдпреВ рдореЗрдВ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдпрд╣ рдмрдХрд╡рд╛рд╕ рд╣реИ - MVVM рдореЗрдВ ViewModel рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред

рдЗрд╕рд▓рд┐рдП, рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╣реА рд╕рдорд╛рдзрд╛рди рд╣реИ ViewModel рдореЗрдВ рдПрдХ рдлрд╝реАрд▓реНрдб рдмрдирд╛рдирд╛ рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рдкреБрд░реБрд╖ рд╣реЛрдВрдЧреЗред рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдХреНрд╖реЗрддреНрд░ рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде рддрд╛рд░реАрдЦ рддрдХ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, KnockoutJS рдХреА рд╕реЗрд╡рд╛ рдирд┐рд░реНрднрд░ observables ред рдХреЛрдб рд╣реИ рдХрд┐ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдкреБрд░реБрд╖реЛрдВ рдХрд╣рддреЗ рд╣реИрдВ рдкрд░ рдЖрдЗрдП рдирдЬрд╝рд░ред
 viewModel.males = ko.dependentObservable(function() { return ko.utils.arrayFilter(this.persons(), function(p) { return p.gender() == 'M'; }); }, viewModel); 


рдЖрд╢реНрд░рд┐рдд рд╡реЗрдзрд╢рд╛рд▓рд╛рдУрдВ рдореЗрдВ рдХрд╛рдо рдХреА рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред рдкрд╣рд▓реЗ рд▓реЙрдиреНрдЪ рдХреЗ рджреМрд░рд╛рди, рдиреЙрдХрдЖрдЙрдЯ "рд╕реНрдорд░рдг" рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рд╡реЗрдзрд╢рд╛рд▓рд╛рдУрдВ рддрдХ рдкрд╣реБрдВрдЪ рдФрд░ рдЙрдирдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рд▓реА рдЧрдИ рдереАред рдпрджрд┐ рдХрд┐рд╕реА рднреА рд╕рдВрдмрдВрдзрд┐рдд рд╡реЗрдзрд╢рд╛рд▓рд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ KO рдирд┐рд░реНрднрд░рддрд╛ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдУрд╡рд░рдлреНрд▓реЛ рдХрд░реЗрдЧрд╛ред
рдпрд╣ рджреВрд╕рд░реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рд╣реЛрдЧрд╛ред

рдХрд╛ рдкрд░рд┐рдгрд╛рдо

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВ рдЪрд╛рд▓рд╛рдХ рдерд╛ рдЬрдм рдореИрдВрдиреЗ рдХрд╣рд╛ рдХрд┐ рдХреЗрдУ рджреЗрдЦ рд░рд╣рд╛ рдерд╛ рдХрд┐ рд╣рдо рдЙрди рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХреЛрдВ рдХреЛ рджреЗрдЦ рд░рд╣реЗ рдереЗ рдЬрдм рд╣рдордиреЗ рдкрд╣рд▓реА рдмрд╛рд░ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдерд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡рд╣ рдРрд╕рд╛ рд╣рд░ рдмрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬрдм рд╡рд╣ рдЖрд╢реНрд░рд┐рдд рдХреЗ рдорд╛рди рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рд╣рдорд╛рд░реЗ рдбреЗрдореЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рджреВрдВрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдпрд╣ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реЗ (рдкреБрд░реБрд╖реЛрдВ рдпрд╛ рдорд╣рд┐рд▓рд╛рдУрдВ рдХреЛ) рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рд▓рд┐рдВрдЧ рднреА рдмрджрд▓рдирд╛ рд╣реИ (рдУрд╣, рдореБрдЭреЗ рдкрд╛рдкреА рдорд╛рдл рдХрд░реЗрдВ)ред

ViewModel

 var Person = function(gender, name) { this.gender = ko.observable(gender); this.name = ko.observable(name); this.changeGender = function() { var g = this.gender() == 'F' ? 'M' : 'F'; this.gender(g); } }; var viewModel = { genderToFilter: ko.observable('M'), persons: ko.observableArray([ new Person('M', 'John Smith'), new Person('M', 'Mr. Sanderson'), new Person('F', 'Mrs. Sanderson'), new Person('M', 'Agent Ralf'), new Person('F', 'Gangretta Peterson') ]), addMale: function() { this.persons.push(new Person('M', 'New male')); }, addFemale: function() { this.persons.push(new Person('F', 'New female')); } }; viewModel.males = ko.dependentObservable(function() { var g = this.genderToFilter(); return ko.utils.arrayFilter(this.persons(), function(p) { return p.gender() == g; }); }, viewModel); ko.applyBindings(viewModel); рд╢реНрд░реАрдорддреА рд╕реИрдВрдбрд░рд╕рди'), var Person = function(gender, name) { this.gender = ko.observable(gender); this.name = ko.observable(name); this.changeGender = function() { var g = this.gender() == 'F' ? 'M' : 'F'; this.gender(g); } }; var viewModel = { genderToFilter: ko.observable('M'), persons: ko.observableArray([ new Person('M', 'John Smith'), new Person('M', 'Mr. Sanderson'), new Person('F', 'Mrs. Sanderson'), new Person('M', 'Agent Ralf'), new Person('F', 'Gangretta Peterson') ]), addMale: function() { this.persons.push(new Person('M', 'New male')); }, addFemale: function() { this.persons.push(new Person('F', 'New female')); } }; viewModel.males = ko.dependentObservable(function() { var g = this.genderToFilter(); return ko.utils.arrayFilter(this.persons(), function(p) { return p.gender() == g; }); }, viewModel); ko.applyBindings(viewModel); рдПрдЬреЗрдВрдЯ рд░рд╛рд▓реНрдл'), var Person = function(gender, name) { this.gender = ko.observable(gender); this.name = ko.observable(name); this.changeGender = function() { var g = this.gender() == 'F' ? 'M' : 'F'; this.gender(g); } }; var viewModel = { genderToFilter: ko.observable('M'), persons: ko.observableArray([ new Person('M', 'John Smith'), new Person('M', 'Mr. Sanderson'), new Person('F', 'Mrs. Sanderson'), new Person('M', 'Agent Ralf'), new Person('F', 'Gangretta Peterson') ]), addMale: function() { this.persons.push(new Person('M', 'New male')); }, addFemale: function() { this.persons.push(new Person('F', 'New female')); } }; viewModel.males = ko.dependentObservable(function() { var g = this.genderToFilter(); return ko.utils.arrayFilter(this.persons(), function(p) { return p.gender() == g; }); }, viewModel); ko.applyBindings(viewModel); Gangretta рдкреАрдЯрд░рд╕рди') var Person = function(gender, name) { this.gender = ko.observable(gender); this.name = ko.observable(name); this.changeGender = function() { var g = this.gender() == 'F' ? 'M' : 'F'; this.gender(g); } }; var viewModel = { genderToFilter: ko.observable('M'), persons: ko.observableArray([ new Person('M', 'John Smith'), new Person('M', 'Mr. Sanderson'), new Person('F', 'Mrs. Sanderson'), new Person('M', 'Agent Ralf'), new Person('F', 'Gangretta Peterson') ]), addMale: function() { this.persons.push(new Person('M', 'New male')); }, addFemale: function() { this.persons.push(new Person('F', 'New female')); } }; viewModel.males = ko.dependentObservable(function() { var g = this.genderToFilter(); return ko.utils.arrayFilter(this.persons(), function(p) { return p.gender() == g; }); }, viewModel); ko.applyBindings(viewModel); 


рдирдП рд╕реЗ, рд╣рдо рдзреНрдпрд╛рди рджреЗрдВ:


рджреЗрдЦреЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рднреА рдХрд╛рдлреА рдорд╛рдореВрд▓реА рд╣реИрдВ:
 <script type="text/html" id="PersonInfo"> <li> <a href="#change" data-bind="text: gender, click: changeGender"></a> <span data-bind="text: name"></span> </li> </script> <table width="100%"> <tr valign="top"> <td width="50%"> <label> <input type="radio" value="M" data-bind="checked: genderToFilter" />Males </label> <label> <input type="radio" value="F" data-bind="checked: genderToFilter" />Femails </label> <div data-bind=" template: { name: 'PersonInfo', foreach: males }"></div> </td> <td> <strong>All</strong> <div data-bind=" template: { name: 'PersonInfo', foreach: persons }"></div> </td> </tr> </table> <a href="#add-male" data-bind="click: addMale">Add male</a> <a href="#add-male" data-bind="click: addFemale">Add female</a> 


рд╣рдордиреЗ рдЪреЗрдХ рдХрд┐рдП рдЧрдП рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рд░реЗрдбрд┐рдпреЛ-рдмрдЯрди рдЬреЛрдбрд╝рд╛ рд╣реИ, рдЬреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд▓рд┐рдВрдЧрдЯреЛрдлрд┐рд▓реНрдЯрд░ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдореВрд▓реНрдп рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд┐рд╕реЗ рдЪреБрдирд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдПрдХ рджреНрд╡рд┐-рджрд┐рд╢рд╛рддреНрдордХ рдмрдВрдзрди рд╣реИ рдЗрд╕рд▓рд┐рдП рдЬрдм рдЖрдк рдмрджрд▓рддреЗ рд╣реИрдВ рддреЛ рдЪрдпрдирд┐рдд рд░реЗрдбрд┐рдпреЛ рдкрд░рд┐рд╡рд░реНрддрди рджреГрд╢реНрдпрдореЙрдбрд▓ рдореЗрдВ рдЖ рдЬрд╛рдПрдВрдЧреЗред рд╣рдордиреЗ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рд▓рд┐рдВрдЧрдЯреЛрдлрд┐рд▓реНрдЯрд░ рдХреНрд╖реЗрддреНрд░ рддрдХ рдкрд╣реБрдВрдЪ рдмрдирд╛рдИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдлрд┐рд░ рд╕реЗ рд╣реЛрдЧрд╛ред

рдЗрд╕реА рддрд░рд╣, рдпрд╣ рдПрдХ рд▓рд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде рд╣реЛрдЧрд╛ред рдЙрд╕рдиреЗ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рд╡рд┐рдзрд┐ рдореЗрдВ рднрд╛рдЧ рд▓рд┐рдпрд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╕реВрдЪреА рдХреЛ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдВрдЧ рдХреЛ рдмрджрд▓рдХрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЗрд╕ рдХреЗ рдкреНрд░рдХрд╛рд╢ рдореЗрдВ, рдзреВрд░реНрддрддрд╛ рдХреА рдореЗрд░реА рдорд╛рдиреНрдпрддрд╛ рд╕рдордп рдкрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрджрд┐ KO рдиреЗ рд╕реНрдХреИрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛ рдХрд┐ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рднрд░реЛрд╕реЗрдордВрдж рдкреБрди: рдЧрдгрдирд╛ рдХреЗ рджреМрд░рд╛рди рдХрд┐рди рд╡реЗрдзрд╢рд╛рд▓рд╛рдУрдВ рддрдХ рдкрд╣реБрдБрдЪрддреЗ рд╣реИрдВ, рддреЛ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдХрд╛рд░рдг рдкреБрдирдГ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдирд╣реАрдВ рд╣реБрдИ рд╣реЛрдЧреАред

рдкрд┐рдЫрд▓реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдереЛрдбрд╝рд╛ рднреНрд░рдорд┐рдд рдереЗ, рд▓реЗрдХрд┐рди рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рджреЗрдЦреЗрдВ

рдирд┐рд╖реНрдХрд░реНрд╖


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдкреВрд░рд╛ рд▓реЗрдЦ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдореЗрдВ рдлреЙрд░реЗрдХреНрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ dependObservable рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рдерд╛ред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, dependObservable рдПрдХ рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЪреАрдЬ рд╣реИред рд╕рдВрдмрдВрдзрд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдЯреНрд░реИрдХ рд░рдЦрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдп рдореЗрдВ, рдЖрдк рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдкрд░ рдЕрддреНрдпрдзрд┐рдХ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпреЛрдВ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЦреБрдж рдХреЗ рд▓рд┐рдП рд╕рд▓рд╛рд╣ рджреЗрддреЗ рд╣реИрдВред

рдЕрдВрдд рддрдХ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореБрдЭреЗ рд╕рд╡рд╛рд▓реЛрдВ рдФрд░ рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛ рдкрд░ рдЦреБрд╢реА рд╣реЛрдЧреАред

Source: https://habr.com/ru/post/In124931/


All Articles