কোনও ইউআই উপাদানগুলির জন্য পিএইচপি কোড জাভাস্ক্রিপ্টের সূচনা করে যা দেখে মনে হয়
<script type="text/x-magento-init">
{
"*": {
"Magento_Ui/js/core/app":{
"types":{...},
"components":{...},
}
}
}
</script>
পৃষ্ঠায় Magento_Ui/js/core/app
কোডটির এই বিটটির অর্থ ম্যাজেন্টো একটি কলব্যাক আনার জন্য প্রয়োজনীয় জেএস মডিউলটি আহ্বান করবে , এবং তারপরে সেই কলব্যাকটি {types:..., components:...}
JSON অবজেক্টে আর্গুমেন্ট হিসাবে ( data
নীচে) পাস করছে বলে কল করবে
#File: vendor/magento/module-ui/view/base/web/js/core/app.js
define([
'./renderer/types',
'./renderer/layout',
'Magento_Ui/js/lib/ko/initialize'
], function (types, layout) {
'use strict';
return function (data) {
types.set(data.types);
layout(data.components);
};
});
ডেটা অবজেক্টে ইউআই উপাদান রেন্ডার করার জন্য প্রয়োজনীয় সমস্ত ডেটা , পাশাপাশি একটি কনফিগারেশন রয়েছে যা কিছু নির্দিষ্ট স্ট্রিংগুলিকে কিছু নির্দিষ্ট ম্যাজেন্টো রাইওয়ারজেএস মডিউলগুলির সাথে সংযুক্ত করে। types
ও layout
ম্যাপিংটি প্রয়োজনীয় জেএস মডিউলগুলিতে ঘটে । অ্যাপ্লিকেশনটিও প্রয়োজনীয় Magento_Ui/js/lib/ko/initialize
জেএস লাইব্রেরি লোড করে । initialize
মডিউল কিক Magento এর KnockoutJS ইন্টিগ্রেশন বন্ধ।
/**
* Copyright © 2016 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
/** Loads all available knockout bindings, sets custom template engine, initializes knockout on page */
#File: vendor/magento/module-ui/view/base/web/js/lib/ko/initialize.js
define([
'ko',
'./template/engine',
'knockoutjs/knockout-repeat',
'knockoutjs/knockout-fast-foreach',
'knockoutjs/knockout-es5',
'./bind/scope',
'./bind/staticChecked',
'./bind/datepicker',
'./bind/outer_click',
'./bind/keyboard',
'./bind/optgroup',
'./bind/fadeVisible',
'./bind/mage-init',
'./bind/after-render',
'./bind/i18n',
'./bind/collapsible',
'./bind/autoselect',
'./extender/observable_array',
'./extender/bound-nodes'
], function (ko, templateEngine) {
'use strict';
ko.setTemplateEngine(templateEngine);
ko.applyBindings();
});
প্রতিটি স্বতন্ত্র প্রয়োজনীয় bind/...
জেএস মডিউল নকআউটের জন্য একটি একক কাস্টম বাঁধাই সেট আপ করে ।
প্রয়োজনীয় extender/...
জেএস মডিউলগুলি নোকআউটজেএস আইটেমগুলিতে কিছু সহায়ক পদ্ধতি যুক্ত করে।
ম্যাজেন্টো ./template/engine
নোকআউটের জাভাস্ক্রিপ্ট টেম্পলেট ইঞ্জিনের প্রয়োজনীয়তা জেএস মডিউলে কার্যকারিতাও প্রসারিত করে ।
অবশেষে, ম্যাজেন্টো applyBindings()
নকআউটজেএস অবজেক্টে কল করে। এটি সাধারণত যেখানে নকআউট প্রোগ্রাম কোনও ভিউ মডেলকে এইচটিএমএল পৃষ্ঠায় আবদ্ধ করে - তবে, ম্যাজেন্টো কোনও ভিউ মডেল applyBindings
ছাড়াই কল করে । এর অর্থ নকআউট পৃষ্ঠা হিসাবে দেখা হিসাবে প্রক্রিয়া করা শুরু করবে, তবে কোনও ডেটা সীমাবদ্ধ নেই।
স্টক নকআউট সেটআপে, এটি কিছুটা মূর্খ হবে। তবে পূর্বে উল্লিখিত কাস্টম নকআউট বাঁধনের কারণে নকআউটকে কাজ করার প্রচুর সুযোগ রয়েছে।
আমরা স্কোপ বাইন্ডিংয়ে আগ্রহী । আপনি এই এইচটিএমএলে দেখতে পাচ্ছেন যে পিএইচপি ইউআই কম্পোনেন্ট সিস্টেমটিও রেন্ডার করেছে।
<div class="admin__data-grid-outer-wrap" data-bind="scope: 'customer_listing.customer_listing'">
<div data-role="spinner" data-component="customer_listing.customer_listing.customer_columns" class="admin__data-grid-loading-mask">
<div class="spinner">
<span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span>
</div>
</div>
<!-- ko template: getTemplate() --><!-- /ko -->
<script type="text/x-magento-init">
</script>
</div>
বিশেষত, data-bind="scope: 'customer_listing.customer_listing'">
গুণাবলী। যখন ম্যাজেন্টো কিকস শুরু applyBindings
করবে, নকআউট এই কাস্টম scope
বন্ধনটি দেখতে পাবে এবং প্রয়োজনীয় ./bind/scope
জেএস মডিউলটি শুরু করবে। একটি কাস্টম বাঁধাই প্রয়োগ করার ক্ষমতা খাঁটি নকআউটজেএস। বাস্তবায়ন সুযোগ বাঁধাই কিছু Magento ইনক সম্পন্ন করেছে।
স্কোপ বাইন্ডিংয়ের বাস্তবায়ন রয়েছে
#File: vendor/magento/module-ui/view/base/web/js/lib/ko/bind/scope.js
এই ফাইলটির গুরুত্বপূর্ণ বিটটি এখানে
var component = valueAccessor(),
apply = applyComponents.bind(this, el, bindingContext);
if (typeof component === 'string') {
registry.get(component, apply);
} else if (typeof component === 'function') {
component(apply);
}
বিশদে না গিয়ে, registry.get
পদ্ধতিটি component
সনাক্তকারী হিসাবে ভেরিয়েবলের স্ট্রিংটি ব্যবহার করে একটি ইতিমধ্যে উত্পন্ন বস্তুটি টেনে আনবে applyComponents
এবং তৃতীয় প্যারামিটার হিসাবে পদ্ধতিতে এটি পাস করবে । স্ট্রিং আইডেন্টিফায়ারটি scope:
( customer_listing.customer_listing
উপরে) এর মান
ভিতরে applyComponents
function applyComponents(el, bindingContext, component) {
component = bindingContext.createChildContext(component);
ko.utils.extend(component, {
$t: i18n
});
ko.utils.arrayForEach(el.childNodes, ko.cleanNode);
ko.applyBindingsToDescendants(component, el);
}
কলে createChildContext
তৈরি করবে কি, মূলত, একটি নতুন viewModel ইতিমধ্যে instantiated কম্পোনেন্ট অবজেক্ট উপর ভিত্তি করে বস্তু, এবং তারপর সব এটি প্রযোজ্য মূল বংশধর উপাদান div
ব্যবহার data-bind=scope:
।
সুতরাং, ইতিমধ্যে তাত্ক্ষণিক উপাদান অবজেক্টটি কী? layout
ফিরে কল কল মনে আছে app.js
?
#File: vendor/magento/module-ui/view/base/web/js/core/app.js
layout(data.components);
layout
ফাংশন / মডিউল পাস মধ্যে নামা হবে data.components
(আবার, এই তথ্য বস্তুর মাধ্যমে পাস থেকে আসে text/x-magento-init
)। এটি যে প্রতিটি বস্তুর সন্ধান করে এটির জন্য এটি কোনও config
বস্তুর সন্ধান করবে এবং সেই কনফিগারেশন বস্তুতে এটি কোনও component
কী সন্ধান করবে । যদি এটি কোনও উপাদান কী খুঁজে পায় তবে তা হবে
RequireJS
একটি মডিউল উদাহরণ ফেরত দিতে ব্যবহার করুন - যেমন মডিউলটি একটি requirejs
/ define
নির্ভরতার মধ্যে ডাকা হয়েছিল ।
জাভাস্ক্রিপ্ট নির্মাতা হিসাবে সেই মডিউল উদাহরণটি কল করুন
ফলস্বরূপ অবজেক্টটি registry
বস্তু / মডিউলে সংরক্ষণ করুন
সুতরাং, এটি গ্রহণ করার জন্য অনেক কিছুই using ব্যবহার করে এখানে একটি দ্রুত পর্যালোচনা দেওয়া হল
<div class="admin__data-grid-outer-wrap" data-bind="scope: 'customer_listing.customer_listing'">
<div data-role="spinner" data-component="customer_listing.customer_listing.customer_columns" class="admin__data-grid-loading-mask">
<div class="spinner">
<span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span>
</div>
</div>
<!-- ko template: getTemplate() --><!-- /ko -->
<script type="text/x-magento-init">
</script>
</div>
একটি সূচনা পয়েন্ট হিসাবে। scope
মান customer_listing.customer_listing
।
আমরা যদি JSON অবজেক্টটি text/x-magento-init
আরম্ভ থেকে দেখি
{
"*": {
"Magento_Ui/js/core/app": {
/* snip */
"components": {
"customer_listing": {
"children": {
"customer_listing": {
"type": "customer_listing",
"name": "customer_listing",
"children": /* snip */
"config": {
"component": "uiComponent"
}
},
/* snip */
}
}
}
}
}
}
আমরা দেখি components.customer_listing.customer_listing
বস্তুর টি config
বস্তু, এবং যে কনফিগ বস্তুর টি component
বস্তু যে সেট uiComponent
। uiComponent
স্ট্রিং একটি RequireJS মডিউল। আসলে, এটির একটি আবশ্যকজেএস ওরফে যা Magento_Ui/js/lib/core/collection
মডিউলটির সাথে সম্পর্কিত।
vendor/magento/module-ui/view/base/requirejs-config.js
14: uiComponent: 'Magento_Ui/js/lib/core/collection',
ইন layout.js
, ম্যাজেন্টোতে নিম্নলিখিত কোডের সমান কোড রয়েছে।
//The actual code is a bit more complicated because it
//involves jQuery's promises. This is already a complicated
//enough explanation without heading down that path
require(['Magento_Ui/js/lib/core/collection'], function (collection) {
object = new collection({/*data from x-magento-init*/})
}
সত্যিই কৌতূহলের জন্য, আপনি যদি সংগ্রহের মডেলটি একবার দেখে থাকেন এবং এর কার্যকরকরণের পথটি অনুসরণ করেন তবে আপনি আবিষ্কার করতে পারবেন collection
এটি একটি জাভাস্ক্রিপ্ট অবজেক্ট যা lib/core/element/element
মডিউল এবং মডিউল উভয় দ্বারা বর্ধিত হয়েছে lib/core/class
। এই কাস্টমাইজেশন গবেষণা এই উত্তরের সুযোগ বাইরে।
একবার তাত্ক্ষণিকভাবে এটি রেজিস্ট্রি এ layout.js
সঞ্চয় করুন object
। এর অর্থ যখন নকআউট বাইন্ডিংগুলি প্রক্রিয়াকরণ শুরু করে এবং কাস্টম scope
বাঁধার সম্মুখীন হয়
<div class="admin__data-grid-outer-wrap" data-bind="scope: 'customer_listing.customer_listing'">
<!-- snip -->
<!-- ko template: getTemplate() --><!-- /ko -->
<!-- snip -->
</div>
ম্যাজেন্টো এই বিষয়টিকে রেজিস্ট্রি থেকে ফিরিয়ে আনবে এবং এটিকে ভিতরে থাকা জিনিসগুলির জন্য দর্শন মডেল হিসাবে আবদ্ধ করবে div
। অন্য কথায়, getTemplate
নকআউট যখন ট্যাগহীন বাঁধাইয়ের ডাক দেয় তখন <!-- ko template: getTemplate() --><!-- /ko -->
সেই getTemplate
পদ্ধতিটি হ'ল new collection
বস্তুটির সেই পদ্ধতি ।