рдиреЙрдХрдЖрдЙрдЯ.рдЬреЗрдПрд╕ рдЬрдЯрд┐рд▓ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИред рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдореЗрд░реЗ рдкрд╛рд╕ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрдВрддреНрд░ рдХрд╛ рдЕрднрд╛рд╡ рдерд╛ред рдореИрдВ рдЗрд╕реЗ рддрдм рддрдХ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдЬрдм рддрдХ рдореБрдЭреЗ рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓ рдЧрдпрд╛ рдХрд┐ window.setTimeout рдЕрдкрдиреЗ рдХреЙрд▓рдмреИрдХ рдХреЛ рд╡рд░реНрддрдорд╛рди рд╕рдВрджрд░реНрдн рдХреЗ рдЕрдВрдд рд╕реЗ рдкрд╣рд▓реЗ рдирд╣реАрдВ рдХрд╣рддрд╛ рд╣реИред рдпрд╛рдиреА рдХреЛрдб рдореЗрдВ
setTimeout("console.log(window.Value)",0),(function (){while (Math.random() < 0.9999999);window.Value = 1;})()
рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд╣реБрдд рдХрд░реАрдм рд╕реЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рдВрдмреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╣реЛрдЧрд╛ред
рдиреЙрдХрдЖрдЙрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реЗрдЦред рдЬреЛ рдмрд╛рдзреНрдпрдХрд╛рд░реА рддрдВрддреНрд░ рдореЗрдВ рдкрд╛рд░рдВрдЧрдд рд╣реИрдВ рдФрд░ customBindings рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП,
рд╕реЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯ (рдХреЙрд▓рдмреИрдХ, 0) рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЬрд╛рдирддреЗ рд╣реБрдП
, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред
рдХрд╕реНрдЯрдо-рдмрд╛рдзреНрдпрдХрд╛рд░реА рдХреЛрдб:
ko.bindingHandlers['asynctemplate'] = { update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { $(element).empty(); var template = ko.utils.unwrapObservable(valueAccessor()); if (!template) return; setTimeout(function() { $.ajax({ url: template }).done(function(result){ var view = $(result).appendTo(element)[0]; ko.applyBindings(bindingContext.$data, view); }); }, 0); } }
рдЖрд╡реЗрджрди:
// <div data-bind="asynctemplate: '/Templates/Controls/Components/Modal.html'"></div> // <div data-bind="asynctemplate: templatePath"></div> // with foreach <div data-bind="asynctemplate: templatePath, with: templateViewModel">!!</div>
рд╢реВрдиреНрдп рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЗ рдмрд┐рдирд╛, рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛрдВрдЧреА: рдпрджрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдХрдо рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рддреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ DOM рдЯреНрд░реА рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдиреЙрдХрдЖрдЙрдЯ рдмрдВрдзрди рддрдВрддреНрд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рддрддреНрд╡ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рд╕реЗ рдкрд╣рд▓реЗред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдмрдВрдзрди рджреЛ рдмрд╛рд░ рд╣реЛрдЧрд╛, рдЬреЛ рдХреБрдЫ рднреА рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдПрдХ рдЕрд╡рд▓реЛрдХрди рдХреНрд╖реЗрддреНрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрдирд╛рдПрдВ, рдЬрд┐рд╕рдореЗрдВ "рд▓реЛрдбрд┐рдВрдЧ ..." рдЬреИрд╕реЗ рдкреНрд▓рдЧ рдХреЛ рдкрд╣рд▓реЗ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЬрдм рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд┐рд▓рддреА рд╣реИ, рддреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реНрд╡рдпрдВ рд▓реЛрдб рд╣реЛрддреА рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдПрдХ рдкрд▓рдХ рдХреЛ рдЙрдХрд╕рд╛рддрд╛ рд╣реИ: рдПрдХ рд▓реЛрдб рд╕рдВрдХреЗрдд рдЖрдзреЗ рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред
рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рдореИрдВ asynctemplate рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреИрд╢рд┐рдВрдЧ рдФрд░ рд╕рдорд░реНрдерди рдХреЛ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ foreach рдХреЗ рд╕рд╛рдеред
UPD: рдЬреИрд╕рд╛ рдХрд┐
xducer рдиреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдмрддрд╛рдпрд╛ рд╣реИ
, рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдиреЙрдХрдЖрдЙрдЯред рдЬреЗрдПрд╕
рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рдПрдХ рд╕рд░рд▓ рддрд░реАрдХрд╛ рд╣реИ: рдХрд╕реНрдЯрдо-рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдореЗрдВ рдЗрдирд┐рдЯ рдЬреЛрдбрд╝реЗрдВ:
ko.bindingHandlers['asynctemplate'] = { init: function () { return { controlsDescendantBindings: true }; }, update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { $(element).empty(); var template = ko.utils.unwrapObservable(valueAccessor()); if (!template) return; $.ajax({ url: template }).done(function (result) { $(result).appendTo(element); ko.applyBindingsToDescendants(bindingContext, element); }); } }
рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдмрд╛рдВрдзрддреЗ рд╕рдордп рдлрд┐рдХреНрд╕реНрдб рдмрдЧ: рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдмрдВрдзрди рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ рддрддреНрд╡ рдкрд░ рд╣реБрдЖред