meaning - angularjs tutorial pdf
कोणीय जेएस निष्पादक नियंत्रक दो बार मुकाबला (14)
AngularJS दस्तावेज़ - एनजी नियंत्रक
ध्यान दें कि आप $ मार्ग सेवा के माध्यम से मार्ग परिभाषा में घोषित करके डीओएम को नियंत्रक भी संलग्न कर सकते हैं। एक सामान्य गलती है कि नियंत्रक को फिर से टेम्पलेट में एनजी-नियंत्रक का उपयोग करके घोषित करना है। इससे नियंत्रक को जोड़ा जा सकता है और दो बार निष्पादित किया जाएगा।
जब आप ng-view
निर्देश के साथ ngRoute का उपयोग करते हैं, तो नियंत्रक डिफ़ॉल्ट रूप से उस डोम तत्व से जुड़ा होता है (या यूई-राउटर का उपयोग करते हुए ui-view)। तो आपको टेम्पलेट में इसे फिर से संलग्न करने की आवश्यकता नहीं होगी।
मैं समझता हूं कि AngularJS कुछ कोड के माध्यम से दो बार चलता है, कभी-कभी और भी, जैसे $watch
घटनाओं, लगातार मॉडल राज्यों की जांच आदि।
हालांकि मेरा कोड:
function MyController($scope, User, local) {
var $scope.User = local.get(); // Get locally save user data
User.get({ id: $scope.User._id.$oid }, function(user) {
$scope.User = new User(user);
local.save($scope.User);
});
//...
दो बार निष्पादित किया गया है, मेरे डीबी में 2 रिकॉर्ड डालने। मैं अभी भी सीख रहा हूं क्योंकि मैं उम्र के लिए इसके खिलाफ अपने सिर को टक्कर लगी हूं!
AngularJS 1.4 आरसी बिल्ड के साथ इस समस्या पर मेरे सिर को खरोंच कर रहे थे, फिर एहसास हुआ कि उपर्युक्त उत्तरों में से कोई भी लागू नहीं हुआ था क्योंकि यह इस लेखन के समय कोणीय 1.4 और कोणीय 2 के लिए नई राउटर लाइब्रेरी से निकला था। इसलिए, मैं यहां किसी भी व्यक्ति के लिए एक नोट छोड़ रहा हूं जो नई कोणीय मार्ग पुस्तकालय का उपयोग कर रहा हो।
असल में यदि किसी एचटीएमएल पेज में आपके ऐप के कुछ हिस्सों को लोड करने के लिए ng-viewport
निर्देश होता है, तो ng-link
साथ निर्दिष्ट हाइपरलिंक पर क्लिक करके संबंधित घटक के लक्ष्य नियंत्रक को दो बार लोड किया जाएगा। सूक्ष्म अंतर यह है कि, यदि ब्राउजर पहले से ही लक्षित नियंत्रक को लोड कर चुका है, तो उसी हाइपरलिंक पर फिर से क्लिक करके केवल नियंत्रक को एक बार ही बुलाया जाएगा।
अभी तक एक व्यवहार्य कामकाज नहीं मिला है, हालांकि मेरा मानना है कि यह व्यवहार shaunxu द्वारा उठाए गए अवलोकन के अनुरूप है, और उम्मीद है कि इस मुद्दे को भविष्य में नई रूट लाइब्रेरी के निर्माण और shaunxu 1.4 रिलीज के साथ हल किया जाएगा।
कुछ मामलों में आपका निर्देश दो बार चलता है जब आप बस इस तरह के निर्देश को बंद करने में सही नहीं करते हैं:
<my-directive>Some content<my-directive>
यह आपके निर्देश को दो बार चलाएगा। इसके अलावा एक और बार ऐसा होता है जब आपका निर्देश दो बार चलता है:
सुनिश्चित करें कि आप अपने index.html
TWICE में अपना निर्देश शामिल नहीं कर रहे हैं!
कोणीय 1.3+ के साथ angular-ui-router का उपयोग करते समय, रूट संक्रमण पर दो बार विचार प्रस्तुत करने के बारे में एक मुद्दा था। इसके परिणामस्वरूप नियंत्रकों को दो बार निष्पादित किया गया। प्रस्तावित समाधानों में से कोई भी मेरे लिए काम नहीं करता है।
हालांकि, 0.2.11 से 0.2.13 तक angular-ui-router
को हल करने के लिए समस्या हल हो गई।
बस एक और मामला जोड़ना चाहते हैं जब नियंत्रक दो बार init कर सकता है (यह angular.js 1.3.1 के लिए वास्तविक है):
<div ng-if="loading">Loading...</div>
<div ng-if="!loading">
<div ng-view></div>
</div>
इस मामले में $ path.current पहले ही सेट हो जाएगा जब ng-view init init। इससे डबल प्रारंभिक कारण बनता है।
इसे ठीक करने के लिए बस ng-if ng-show / ng-hide को बदलें और सभी अच्छी तरह से काम करेंगे।
मुझे एक ही समस्या थी और सभी उत्तरों की कोशिश करने के बाद मुझे अंत में पता चला कि मेरे पास मेरे विचार में निर्देश था जो एक ही नियंत्रक के लिए बाध्य था।
APP.directive('MyDirective', function() {
return {
restrict: 'AE',
scope: {},
templateUrl: '../views/quiz.html',
controller: 'ShowClassController'
}
});
निर्देश को हटाने के बाद नियंत्रक को दो बार बुलाया जाना बंद कर दिया। अब मेरा सवाल यह है कि इस समस्या का उपयोग इस समस्या के बिना नियंत्रक दायरे से कैसे किया जा सकता है?
मुझे लगा कि मेरा दो बार बुलाया जा रहा है क्योंकि मैं अपने एचटीएमएल से विधि को दो बार बुला रहा था।
`<form class="form-horizontal" name="x" ng-submit="findX() novalidate >
<input type="text"....>
<input type="text"....>
<input type="text"....>
<button type="submit" class="btn btn-sm btn-primary" ng-click="findX()"
</form>`
हाइलाइट किया गया अनुभाग findX () को दो बार बुलाया जा रहा था। उम्मीद है कि यह किसी की मदद करता है।
मेरा मुद्दा खोज पैरामीटर को अपडेट कर रहा था जैसे $location.search('param', key);
आप इसके बारे में यहां और अधिक पढ़ सकते हैं
यूआरएल में पैराम संलग्न करने के कारण नियंत्रक को दो बार बुलाया जा रहा है
मेरे मामले में नियंत्रक को एक अलग नाम पर नाम बदलने से समस्या हल हो गई।
" कोणीय-यूई-पेड़ " मॉड्यूल के साथ नियंत्रक नामों का एक संघर्ष था: मैंने अपने नियंत्रक को "कैटलॉग ट्री कंट्रोलर" से " ट्रीकंट्रोलर " में बदल दिया और फिर इस नियंत्रक को उस पृष्ठ पर दो बार शुरू किया जाना शुरू किया जहां " ui-tree " निर्देश का उपयोग किया गया था क्योंकि यह निर्देश " ट्रीकंट्रोलर " नामक नियंत्रक का उपयोग करता है।
मेरे मामले में यह यूआरएल पैटर्न के कारण था
मेरा यूआरएल / यूई / प्रोजेक्ट / पैरामीटर 1 / पैरामीटर 2 जैसा था।
राज्य परिवर्तन के सभी मामलों में मुझे paramerter2 की आवश्यकता नहीं थी। ऐसे मामलों में जहां मुझे दूसरे पैरामीटर की आवश्यकता नहीं थी, मेरा यूआरएल / ui / project /: पैरामीटर 1 / जैसा होगा। और इसलिए जब भी मेरे पास राज्य परिवर्तन होता तो मैं अपने नियंत्रक को दो बार ताज़ा कर दूंगा।
समाधान पैरामीटर 2 को खाली स्ट्रिंग के रूप में सेट करना था और राज्य परिवर्तन करना था।
मैं बस इसके माध्यम से चला गया, लेकिन मुद्दा स्वीकार किए गए जवाब से अलग था। मैं इसे अपने भविष्य के लिए यहां छोड़ रहा हूं, इसे ठीक करने के लिए मैंने जो कदम उठाए थे, उन्हें शामिल करने के लिए।
- अनावश्यक नियंत्रक घोषणाओं को हटा दें
- मार्गों में पिछली स्लैश की जांच करें
-
ng-ifs
लिए जाँच करें - किसी भी अनावश्यक रैपिंग
ng-view
कॉल के लिए जांचें (मैंने गलती से एकng-view
में छोड़ा था जो मेरे वास्तविकng-view
को लपेट रहा था। इसके परिणामस्वरूप मेरे नियंत्रकों को तीन कॉल हुए।) - यदि आप रेल पर हैं, तो आपको अपने
application.js
फ़ाइल सेturbolinks
मणि को हटा देना चाहिए। मैंने इसे खोजने के लिए पूरे दिन बर्बाद कर दिया। here जवाब मिला। - ऐप को एनजी-एप और बूटस्ट्रैप के साथ दो बार शुरू करना। कोणीय जेएस निष्पादक नियंत्रक दो बार मुकाबला
- 'लिंक' में पूरे तत्व पर $ संकलन का उपयोग करते समय-निर्देश के कार्य जिसमें इसके स्वयं के नियंत्रक भी परिभाषित होते हैं और इस नियंत्रक के कॉलबैक को एनजी-क्लिक आदि के माध्यम से टेम्पलेट में उपयोग करते here । here जवाब मिला।
मैंने इस ऐप पर अपनी ऐप और इसकी सभी निर्भरताओं को तोड़ दिया (यहां विवरण: AngularJS ऐप दो बार शुरू हुआ (सामान्य समाधानों की कोशिश की ..) )
और अंत में, यह सभी बटरंग क्रोम प्लगइन की गलती थी।
इस जवाब में संकल्प:
मैं किसी भी सूची में पहली चीज़ की दृढ़ता से अनुशंसा करता हूं कि कोड को बदलने से पहले इसे प्रति पोस्ट अक्षम करें।
मैंने बस मेरा हल किया, जो वास्तव में काफी निराशाजनक था। इसका एक आयनिक हाइब्रिड ऐप है, मैंने यूई-राउटर v0.2.13 का उपयोग किया है। मेरे मामले में एक एपब पाठक (epub.js का उपयोग करके) है जो एक बार जब मैं अपनी पुस्तकें लाइब्रेरी पर नेविगेट करता हूं और किसी अन्य पुस्तक का चयन करता हूं तो लगातार "कोई दस्तावेज़ नहीं मिला" की रिपोर्टिंग कर रहा था। जब मैंने ब्राउजर बुक को फिर से लोड किया था तो पूरी तरह से प्रस्तुत किया जा रहा था, लेकिन जब मैंने दूसरी पुस्तक का चयन किया तो फिर भी वही समस्या आई।
मेरा हल बहुत आसान था। मैंने बस reload:true
हटा दिया reload:true
$state.go("app.reader", { fileName: fn, reload: true });
से reload:true
$state.go("app.reader", { fileName: fn, reload: true });
मेरे LibraryController
यदि आप जानते हैं कि आपका नियंत्रक अनजाने में एक से अधिक बार निष्पादित कर रहा है, तो आपत्तिजनक नियंत्रक के नाम के लिए अपनी फ़ाइलों के माध्यम से एक खोज का प्रयास करें, पूर्व: खोज: MyController सभी फ़ाइलों के माध्यम से। शायद यह किसी अन्य एचटीएमएल / जेएस फ़ाइल में कॉपी-पेस्ट हो गया है और जब आप उन आंशिक / नियंत्रकों का विकास या उपयोग करना चाहते हैं तो आप इसे बदलना भूल गए हैं। स्रोत: मैंने यह गलती की है