рдиреЙрдХрдЖрдЙрдЯJS: рд╕реНрдЯреЗрдЯрдлреБрд▓ рд▓рд┐рд╕реНрдЯ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ



рдпрджрд┐ рдЖрдк рдиреЙрдХрдЖрдЙрдЯ рдЬреЗрдПрд╕ рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЕрдЪреНрдЫреЗ рд╣реИрдВ, рддреЛ рдкрд╛рд╕ рди рдХрд░реЗрдВ! , рд╣рдореЗрдВ рдЖрдкрдХреЗ рдЬреНрдЮрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдиреМрд╕рд┐рдЦрд┐рдпрд╛, рдпрд╣ рдпрд╛рдж рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдиреЙрдХрдЖрдЙрдЯJS рдореЗрдВ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдПрдВрдЧреА ред

рдХреБрдХреА рдореЗрдВ рдлрд╝рд┐рд▓реНрдЯрд░реЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реБрдП рд╕реВрдЪреА рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдирд╛ рд╣реИред
рддрд▓рд╛рд╢: рдиреЙрдХрдЖрдЙрдЯ рдЬреЗрдПрд╕ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рддрд╛рдХрд┐ рдЦрд░рд╛рдм рдХреЛрдб рдХрд╛ рдЙрддреНрдкрд╛рджрди рди рд╣реЛред

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

рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ






рд╕реНрд░реЛрдд рдХреЛрдб


рдлрд┐рд▓реНрдЯрд░

<div class="filter-list"> <div class="filter"> <label for="filter_ended"><input type="checkbox" data-bind="checked: filterEnded" id="filter_ended" /> </label> </div> <div class="filter"> <label for="filter_simple"><input type="checkbox" data-bind="checked: isSimpleView" id="filter_simple"/>  </label> </div> <div class="filter"> <label for="filter_sort_date"><input type="radio" data-bind="checked: sorting" value="date" id="filter_sort_date" />   </label> </div> <div class="filter"> <label for="filter_sort_abc"><input type="radio" data-bind="checked: sorting" value="asc" id="filter_sort_abc" />  </label> </div> </div> 

data-bind="..." - HTML рдореЗрдВ рдиреЙрдХрдЖрдЙрдЯ рдХрд╛ рдмрдВрдзрдиред

 <input type="checkbox" data-bind="checked: filterEnded" id="filter_ended" /> 
- filterEnded == true checked рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд╕реЗрдЯ рдХрд░рддрд╛ checked рдпрджрд┐ filterEnded == true

 <input type="radio" data-bind="checked: sorting" value="date" id="filter_sort_date" /> 
- рдЕрдЧрд░ sorting рдореВрд▓реНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ value рдмрд░рд╛рдмрд░ рд╣реИ, рддреЛ checked рдХреА checked рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗрдЯ рдХрд░рддрд╛ checked

рд░рд╛рдп

 <div class="items" data-bind="foreach: filteredItems, css: {items_simple: isSimpleView}"> <div class="item" data-bind="text: name, css: {item_is_ended: is_ended}"></div> </div> 

filteredItems - рдПрдХ рд╕рд░рдгреА рдЬреЛ рдлрд╝рд┐рд▓реНрдЯрд░реНрдб рдЖрдЗрдЯрдо рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИред рд╕рднреА рддрддреНрд╡ viewModel.items рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВред

foreach: filteredItems .items - рд╕рд░рдгреА рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХреЗ рдЕрдВрджрд░ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд▓рд╛рдЧреВ .items ред

css: {items_simple: isSimpleView} - .items_simple рд╡рд░реНрдЧ рдХреЛ .items рдпрджрд┐ isSimpleView == true ред

text: name - filteredItems $data.name рд╕реЗ рд╕рд░рдгреА рддрддреНрд╡ рдХреЗ name рдкреИрд░рд╛рдореАрдЯрд░ ( $data.name рд╡рд┐рдХрд▓реНрдк) рдХрд╛ рдкрд╛рда рдореВрд▓реНрдп рджрд┐рдЦрд╛рддрд╛ рд╣реИред

рдбреЗрдЯрд╛

 $items_json = json_encode( array( array( 'name' => '-', 'is_ended' => false, 'order_date' => 1 ), array( 'name' => '', 'is_ended' => false, 'order_date' => 2 ), array( 'name' => ' ', 'is_ended' => true, 'order_date' => 3 ), array( 'name' => 'GTO', 'is_ended' => true, 'order_date' => 4 ), )) 


рдкреНрд▓рдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЬреЗрдПрд╕ ( body рдмрдВрдж рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ)

 <script type="text/javascript" src="/assets/js/cookie.js"></script> <script type="text/javascript" src="/assets/js/libs/knockout-2.1.0.js"></script> <script type="text/javascript"> var data_items = <?= $items_json ?>; </script> <script type="text/javascript" src="/assets/js/filters.ko.js"></script> 


ViewModel ( filters.ko.js )

 (function () { //         false var getParamBool = function (paramName) { return !!((getCookie(paramName) === 'true')); }; //         defaultValue,     var getParam = function (paramName, defaultValue) { return getCookie(paramName) ? getCookie(paramName) : defaultValue; }; var viewModel = { items: ko.observableArray(data_items), // ,      filterEnded: ko.observable(getParamBool('filterEnded')), isSimpleView: ko.observable(getParamBool('isSimpleView')), sorting: ko.observable(getParam('sorting', 'date')), sortTypes: { //       'asc': function (left, right) { return left.name === right.name ? 0 : (left.name < right.name ? -1 : 1) }, 'date': function (left, right) { return left.order_date === right.order_date ? 0 : (left.order_date < right.order_date ? -1 : 1) } }, sortProcesssing: function (sortType) { //   sortType = sortType || this.sorting(); if (this.sortTypes[sortType]) { setCookie('sorting', sortType, 30); this.items.sort(this.sortTypes[sortType]); //  sort()    } } }; //   items  viewModel.filteredItems = ko.computed(function () { var onlyEnded = this.filterEnded(); if (onlyEnded) return ko.utils.arrayFilter(this.items(), function (item) { //  return item.is_ended == onlyEnded; }); else return this.items(); }, viewModel); //     ,     viewModel.sorting.subscribe(function (sortType) { viewModel.sortProcesssing(sortType); }); viewModel.filterEnded.subscribe(function (newValue) { setCookie('filterEnded', newValue, 30); }); viewModel.isSimpleView.subscribe(function (newValue) { setCookie('isSimpleView', newValue, 30); }); //       View viewModel.sortProcesssing(); ko.applyBindings(viewModel); //   })(); 


рд╕рдВрдмрдВрдзрд┐рдд рд╕рд╛рдордЧреНрд░реА




рдорд╛рд╕реНрдЯрд░реНрд╕, рдЖрдк рдХреЛрдб рдХреЛ рдФрд░ рдмреЗрд╣рддрд░ рдХреИрд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВ?


UPD: рдХреЛрдб рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ред
Xducer рдХреА рд╕рд▓рд╛рд╣ рдкрд░

Mac2000 рдФрд░ xducer рдХреА рд╕рд▓рд╛рд╣ рдкрд░ , рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЕрдзрд┐рдХ рддрд╛рд░реНрдХрд┐рдХ рдирд╛рдо рджрд┐рдП рдЧрдП рд╣реИрдВ рдЬреЛ рдмреЗрд╣рддрд░ рд░реВрдк рд╕реЗ рдЙрдирдХреЗ рд╕рд╛рд░ рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВред

UPD2:
рдкреЛрд░реНрд╕рд▓рд╛рдиреЛрд╕рд╛ рдФрд░ рд╕рд░реНрдЬреЛрдЧрд╛ рдХреА рд╕рд▓рд╛рд╣ рдкрд░, рдХреЛрдб рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред

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


All Articles