javascript - Angular: How to access parameters outside of $timeout callback? -
मेरे पास इस तरह एक टाइमआउट पाश है:
var somedata = {autoRefreshInterval: 300, AutoRefreshInSec: 300, myTimeout: रिक्त, doRefresh: _doRefresh, onTimeout: फ़ंक्शन () {this.autoRefreshInSec--; अगर (this.autoRefreshInSec & lt; = 0) {this.autoRefreshInSec = this.autoRefreshInterval; this.doRefresh (); } This.myTimeout = $ टाइमआउट (this.onTimeout, 1000); }, StartTimer: फ़ंक्शन () {this.autoRefreshInSec = this.autoRefreshInterval; This.myTimeout = $ टाइमआउट (this.onTimeout, 1000); }, स्टॉप टायमर: फ़ंक्शन () {$ timeout.cancel (this.myTimeout); },} ऐसा प्रतीत होता है कि "यह" ऑन-टाइमआउट कॉलबैक फ़ंक्शन के अंदर काम नहीं करता है, जबकि यह startTimer और stopTimer के लिए ठीक काम करता है। इसे ठीक कैसे करें?
अद्यतन करें:
चूंकि यह नीचे दिए गए उत्तरों में से एक के आधार पर इन-टाइमआउट के अंदर खो गया है, मैंने इसे इस तरह से पास करने की कोशिश की: < पूर्व> ऑन-टाइमआउट: फ़ंक्शन (स्वयं) {self.autoRefreshInSec--; अगर (आत्म। AutoRefreshInSec & lt; = 0) {self.autoRefreshInSec = self.autoRefreshInterval; // इसे यहाँ सेट करें ताकि वह तुरंत ताज़ा करना शुरू कर सके। ताज़ा करने के बाद इसे रीसेट किया जाएगा। self.doRefresh (); } Self.myTimeout = $ टाइमआउट (स्वयं। टाइमटाइमआउट (स्वयं), 1000); }, StartTimer: फ़ंक्शन () {this.autoRefreshInSec = this.autoRefreshInterval; This.myTimeout = $ टाइमआउट (this.onTimeout (यह), 1000); }, अजीब तरह से, जब मैं कोड के माध्यम से डीबग करता हूं, तो यह काम करता है। हालांकि, एक बार जब मैंने ब्रेक पॉइंट निकाल दिए, तो स्वयं। डर रिफ्रेश () लगातार निकाल दिया जाता है। क्यों?
2 अद्यतन:
ठीक है, मैंने समस्या को स्पष्ट करने के लिए एक JSFiddle बनाया।
Function.prototype.bind () बाँध () विधि एक नया फ़ंक्शन बनाता है, जिसे बुलाया जाता है, की इस कीवर्ड को दिए गए मान पर सेट किया गया है, जो किसी नए फ़ंक्शन के नाम पर दिए गए किसी भी पूर्ववर्ती तर्कों के साथ दिया गया है।
आपके केस के लिए समाधान
<पूर्व वर्ग = "टुकड़ा-कोड-js लैंग-js prettyprint-ओवरराइड"> <कोड> angular.module ( 'MyApp', []) .service ( 'timerService', समारोह ($ टाइमआउट) {var _timer = { autoRefreshInterval: 300, autoRefreshInSec: 300, myTimeout: अशक्त, onTimeout: function () {this.autoRefreshInSec - = 1; अगर (this.autoRefreshInSec & lt; = 0) {this.autoRefreshInSec = this.autoRefreshInterval; console.log ( 'ताज़ा ');} console.log (' समय: ', this.autoRefreshInSec); this.myTimeout = $ टाइमआउट (this.onTimeout.bind (यह), 1000);}, startTimer: function () {अगर (this.myTimeout ) {वें} Is.stopTimer (this.myTimeout)} this.autoRefreshInSec = this.autoRefreshInterval; This.myTimeout = $ टाइमआउट (this.onTimeout.bind (यह), 1000); }, स्टॉप टायमर: $ timeout.cancel // नोट देखें (1)}; Var संदर्भ = {टाइमर: _timer}; वापसी संदर्भ; ।}) नियंत्रक ( 'PrefsCtrl', समारोह PrefsCtrl ($ गुंजाइश, timerService) {$ scope.timer = timerService.timer;}) <कोड> & lt; स्क्रिप्ट src =" https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js "& gt; & lt; / स्क्रिप्ट & gt; & Lt; div ng-app = "myApp" & gt; & Lt; div ng-controller = "PrefsCtrl" & gt; & Lt; बटन एनजी-क्लिक = "टाइमर.टार्टटाइमर ()" & gt; टाइमर को प्रारंभ या रीसेट करने के लिए क्लिक करें & lt; / button & gt; & Lt; div & gt; {{timer.autoRefreshInSec}} & lt; / div & gt; & Lt; / div & gt; नोट (1) , यह के लिए shorcut है StopTimer: फ़ंक्शन (टाइमर) {$ timeout.cancel (टाइमर)}
Comments
Post a Comment