2013-06-09 15 views
8

मैं एक बच्चे पॉपअप से पैरेंट विंडो पर स्कोप वैल्यू अपडेट करने का प्रयास कर रहा हूं। लेकिन जब भी मैं मूल विंडो स्कोप तक पहुंचने का प्रयास करता हूं, तो यह अनिर्धारित हो जाता है। चूंकि इसमें दो खिड़की शामिल हैं, इसलिए मैं इसके लिए एक पहेली नहीं बना सका। कोड नमूना नीचे चिपकाया गया है।बाल खिड़की से पैरेंट विंडो कोणीय दायरे तक पहुंच

मुख्य पृष्ठ (main.html)

<!doctype html> 
<html> 
    <head> 
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script> 
    <script> 
    var myApp = angular.module('myApp',[]); 
    function MyCtrl($scope) { 
     $scope.name = 'Superhero'; 
    } 
    </script> 
    </head> 
    <body ng-app="myApp"> 
    <div id="ctrl" ng-controller="MyCtrl"> 
     Hello, {{name}}! 
     <input type="button" value="Open popup!!" onclick="window.open('child.html');"/> 
    </div> 
    </body> 
</html> 

बाल खिड़की (child.html)

<!doctype html> 
<html > 
    <head> 
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script> 
    <script> 
    function change(){ 
     var e = window.opener.document.getElementById('ctrl'); 
     var ae = angular.element(e); 
     var s = ae.scope(); 
     s.name="New Superhero"; 
     s.$apply(); 
    } 
    </script> 
    </head> 
    <body> 
     <input type="button" value="Update parent scope!" onclick="change();"/> 
    </body> 
</html> 

यहाँ जब भी मैं दिखाया गया है, कोणीय तत्व से दायरे तक पहुँचने का प्रयास उपरोक्त परिवर्तन विधि में, यह अनिर्धारित [ae.scope()] लौटाता है। लेकिन जब एक ही कोड मूल विंडो में किसी फ़ंक्शन में स्थानांतरित हो जाता है [केवल 'ctrl' तत्व को कैसे पहुंचा जा रहा है में अंतर), यह ठीक काम करता है और मैं सक्षम था स्कोप चर अद्यतन करें। क्या कोई इस बात को इंगित कर सकता है कि वास्तव में क्या गलत हो रहा है? धन्यवाद

+0

मुझे यकीन है कि के रूप में चाइल्ड विंडो स्क्रिप्ट \ माता पिता पर लोड कार्यों के लिए उपयोग नहीं हो सकता है अगर यह के रूप में दो खिड़कियां शामिल कर रहे हैं काम करेंगे, नहीं हूँ। आप एंगुलरस्ट्रैप जैसे विकल्पों को क्यों नहीं देखते हैं, जिनके पास मॉडल पॉपअप है http://mgcrea.github.io/angular-strap/ – Chandermani

+0

@ कंधर्मनी सुझाव के लिए धन्यवाद। आवश्यकता पॉपअप का उपयोग करने पर जोर देती है। तो मोडल विंडो विकल्प के साथ नहीं जा सकते। इसके अलावा, बाल विंडो पैरेंट विंडो पर डोम और स्क्रिप्ट तक पहुंच पाएगी। तो मुझे विश्वास है कि कुछ और गलत हो रहा है – Bibin

उत्तर

10

सलामी बल्लेबाज से angular संदर्भ का उपयोग करें:

function change() { 
    var s = window.opener.angular.element('#ctrl').scope(); 
    s.name="New Superhero"; 
    s.$apply(); 
} 
+3

यदि आप डीबग जानकारी बंद कर देते हैं तो यह अब काम नहीं करेगा https://docs.angularjs.org/api/ng/provider/$compileProvider#debugInfoEnabled। चूंकि उत्पादन अनुप्रयोगों के लिए डीबग को अक्षम करने की अनुशंसा की जाती है, तो यह समाधान काम नहीं करेगा। – PickYourPoison

9

मुझे एक समान आवश्यकता थी और कोणीय.लेमेंट का उपयोग करके दायरे तक पहुंचने में भी यही समस्या थी। मैं के रूप में यद्यपि इस प्रकार है इसे हल करने में सक्षम था किया गया था:

आपका मुख्य/माता-पिता नियंत्रक में कुछ इस तरह करते हैं:

$scope.food = 'Mac & Cheese'; 
window.$windowScope = $scope; 
$window.open('views/anotherWindow.html', '_blank','menubar=yes,toolbar=yes,location=yes,resizable=yes,scrollbars=yes,status=yes,personalbar=yes'); 

तो चाइल्ड विंडो नियंत्रक में आप $ windowScope इस तरह उपयोग कर सकते हैं:

$scope.parentWindow = window.opener.$windowScope; 
console.log($scope.parentWindow.food); 

डेटा को सीधे दायरे में डालने का विकल्प broadcast and/or emit events पर $ विंडो स्कोप का उपयोग करना होगा, जो कोणीय में क्रॉस-कंट्रोलर संचार का पसंदीदा तरीका है।

+0

आप बच्चे की खिड़की में दायरे को कैसे स्थानांतरित करते हैं। यह स्कोप अपरिभाषित – Andrei

संबंधित मुद्दे