UI घटक के लिए PHP कोड इस तरह दिखने वाले एक जावास्क्रिप्ट आरंभण का प्रतिपादन करता है
<script type="text/x-magento-init">
{
"*": {
"Magento_Ui/js/core/app":{
"types":{...},
"components":{...},
}
}
}
</script>
पृष्ठ के इस बिट कोड का मतलब है कि Magento 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);
};
});
डेटा ऑब्जेक्ट सभी शामिल हैं डेटा UI घटक रेंडर करने के लिए की जरूरत है, साथ ही है कि कुछ Magento RequireJS मॉड्यूल के साथ लिंक विशेष स्ट्रिंग से एक विन्यास। यह मैपिंग आवश्यकता 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/...
JJ मॉड्यूल देशी नॉकआउटJS वस्तुओं में कुछ सहायक तरीके जोड़ते हैं।
Magento भी ./template/engine
आवश्यकता के मॉड्यूल में नॉकआउट के जावास्क्रिप्ट टेम्पलेट इंजन की कार्यक्षमता का विस्तार करता है ।
अंत में, मैगेंटो applyBindings()
नॉकआउट जेएस ऑब्जेक्ट पर कॉल करता है। यह सामान्य रूप से है जहां एक नॉकआउट कार्यक्रम HTML पृष्ठ पर एक दृश्य मॉडल को बांध देगा - हालांकि, Magento एक दृश्य मॉडल के applyBindings
बिना कॉल करता है । इसका मतलब है कि नॉकआउट पृष्ठ को एक दृश्य के रूप में संसाधित करना शुरू कर देगा, लेकिन कोई डेटा बाध्य नहीं होगा।
स्टॉक नॉकआउट सेटअप में, यह थोड़ा मूर्खतापूर्ण होगा। हालाँकि, पहले बताए गए कस्टम नॉकआउट बाइंडिंग के कारण, नॉकआउट के लिए चीजों को करने के लिए बहुत सारे अवसर हैं।
हम स्कोप बाइंडिंग में रुचि रखते हैं । आप देख सकते हैं कि इस HTML में, PHP UI घटक प्रणाली द्वारा भी प्रस्तुत किया गया है।
<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'">
विशेषता। जब Magento बंद हो जाता है 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
ऑब्जेक्ट / मॉड्यूल में संग्रहीत करें
इसलिए, इसमें बहुत कुछ है। यहां एक त्वरित समीक्षा की जा रही है
<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
।
यदि हम text/x-magento-init
आरंभ से JSON ऑब्जेक्ट को देखते हैं
{
"*": {
"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
, Magento के पास कोड है जो निम्नलिखित के बराबर है।
//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>
Magento इस ऑब्जेक्ट को रजिस्ट्री से वापस लाएगा, और इसे अंदर की चीजों के लिए व्यू मॉडल के रूप में बाँध देगा div
। दूसरे शब्दों में, वह getTemplate
विधि जिसे नॉकआउट ने टैगलेस बाइंडिंग ( <!-- ko template: getTemplate() --><!-- /ko -->
) कहा जाता है, कहा जाता हैgetTemplate
new collection
ऑब्जेक्ट पर विधि लागू ।