स्थिति
हमारे एंगुलर ऐप के भीतर नेस्टेड एक पेज है, जो एक कंट्रोलर द्वारा समर्थित पेज कहलाता है, जिसमें एनजी-बिंद-एचटीएमएल-असुरक्षित विशेषता वाला डिव होता है। इसे 'पेज कॉन्टेंट' नामक एक $ स्कोप var को सौंपा गया है। यह संस्करण एक डेटाबेस से गतिशील रूप से उत्पन्न HTML को असाइन करता है। जब उपयोगकर्ता अगले पृष्ठ पर फ़्लिप करता है, तो DB को एक कॉल किया जाता है, और इस नए HTML में पेजकॉन्टेंट संस्करण सेट किया जाता है, जो एनजी-बिंद-एचटीएमएल-असुरक्षित के माध्यम से ऑनस्क्रीन प्रदान किया जाता है। यहाँ कोड है:
पृष्ठ निर्देश
angular.module('myApp.directives')
.directive('myPage', function ($compile) {
return {
templateUrl: 'page.html',
restrict: 'E',
compile: function compile(element, attrs, transclude) {
// does nothing currently
return {
pre: function preLink(scope, element, attrs, controller) {
// does nothing currently
},
post: function postLink(scope, element, attrs, controller) {
// does nothing currently
}
}
}
};
});
पृष्ठ निर्देश का टेम्प्लेट (" पृष्ठ। Html" टेम्प्लेट से ऊपर प्रॉपर्टी)
<div ng-controller="PageCtrl" >
...
<!-- dynamic page content written into the div below -->
<div ng-bind-html-unsafe="pageContent" >
...
</div>
पृष्ठ नियंत्रक
angular.module('myApp')
.controller('PageCtrl', function ($scope) {
$scope.pageContent = '';
$scope.$on( "receivedPageContent", function(event, args) {
console.log( 'new page content received after DB call' );
$scope.pageContent = args.htmlStrFromDB;
});
});
यह काम करता है। हम डीबी से पृष्ठ के HTML को ब्राउज़र में अच्छी तरह से प्रस्तुत करते हैं। जब उपयोगकर्ता अगले पृष्ठ पर जाता है, तो हम अगले पृष्ठ की सामग्री देखते हैं, और इसी तरह। अब तक सब ठीक है।
समस्या
यहाँ समस्या यह है कि हम एक पृष्ठ की सामग्री के अंदर संवादात्मक सामग्री रखना चाहते हैं। उदाहरण के लिए, HTML में एक थंबनेल छवि हो सकती है, जब उपयोगकर्ता उस पर क्लिक करता है, तो कोणीय को कुछ कमाल करना चाहिए, जैसे कि पॉप-अप मोडल विंडो प्रदर्शित करना। मैंने अपने डेटाबेस में कोणीय विधि कॉल (एनजी-क्लिक) को एचटीएमएल स्ट्रिंग्स में रखा है, लेकिन निश्चित रूप से एंगुलर या तो विधि कॉल या निर्देशों को पहचानने वाला नहीं है जब तक कि यह किसी तरह से HTML स्ट्रिंग को पार्स नहीं करता, उन्हें पहचानता है और उन्हें संकलित करता है।
हमारे डीबी में
पेज 1 के लिए सामग्री:
<p>Here's a cool pic of a lion. <img src="lion.png" ng-click="doSomethingAwesone('lion', 'showImage')" > Click on him to see a large image.</p>
पेज 2 के लिए सामग्री:
<p>Here's a snake. <img src="snake.png" ng-click="doSomethingAwesone('snake', 'playSound')" >Click to make him hiss.</p>
पेज कंट्रोलर में वापस, हम फिर इसी $ स्कोप फंक्शन को जोड़ते हैं:
पृष्ठ नियंत्रक
$scope.doSomethingAwesome = function( id, action ) {
console.log( "Going to do " + action + " with "+ id );
}
मैं यह पता नहीं लगा सकता कि DB से HTML स्ट्रिंग के भीतर 'doSomethingAwesome' पद्धति को कैसे कॉल किया जाए। मुझे पता है कि कोणीय को HTML स्ट्रिंग को किसी तरह पार्स करना है, लेकिन कैसे? मैंने $ संकलित सेवा के बारे में अस्पष्ट अस्पष्ट पढ़ा है, और कुछ उदाहरणों की प्रतिलिपि बनाई और चिपकाई है, लेकिन कुछ भी काम नहीं करता है। साथ ही, अधिकांश उदाहरण गतिशील सामग्री को केवल निर्देशन के लिंकिंग चरण के दौरान सेट करते हुए दिखाते हैं। हम चाहते हैं कि ऐप के दौरान पेज ज़िंदा रहे। यह लगातार नई सामग्री प्राप्त करता है, संकलित करता है और प्रदर्शित करता है क्योंकि उपयोगकर्ता पृष्ठों के माध्यम से फ़्लिप करता है।
एक सार अर्थ में, मुझे लगता है कि आप कह सकते हैं कि हम एक कोणीय ऐप के भीतर कोणीय के गतिशील रूप से घोंसले की कोशिश कर रहे हैं, और उन्हें अंदर और बाहर स्वैप करने में सक्षम होने की आवश्यकता है।
मैंने कई बार कोणीय दस्तावेज के विभिन्न बिट्स, साथ ही साथ सभी प्रकार के ब्लॉग पोस्ट पढ़े हैं, और जेएस लोगों के कोड के साथ भरा हुआ है। मुझे नहीं पता कि क्या मैं पूरी तरह से कोणीय को गलत समझ रहा हूं, या बस कुछ सरल याद कर रहा हूं, या शायद मैं धीमा हूं। किसी भी मामले में, मैं कुछ सलाह का उपयोग कर सकता हूं।