10

मैं एक कोणीय यूआई मोडल जोड़ रहा हूं जहां मैं 2 विंडो बाध्यकारी के लिए मॉडल विंडो के माध्यम से दायरा पास कर रहा हूं। मैंने दायरे के मूल्य को पारित करने के लिए resolve विधि का उपयोग किया। ऐसा करने से कार्यों का प्रकार काम करता है जिसका अर्थ है कि जब एनजी-मॉडल मान माता-पिता में बदलता है, तो यह मोडल विंडो के अंदर प्रतिबिंबित होता है। हालांकि, यदि मोडल विंडो के अंदर मान बदलता है, तो यह पैरेंट एनजी-मॉडल में प्रतिबिंबित नहीं होता है। यहाँ मेरी कोड है:कोणीय यूआई मोडल 2 वे बाध्यकारी काम नहीं कर रहे

HTML:

<div ng-app="app"> 
    <div ng-controller="ParentController"> 
     <br /> 
     <input type="text" ng-model="textbox.sample" /> 
     <a class="btn btn-default" ng-click="open(textbox.sample)">Click Me</a> 

     <script type="text/ng-template" id="ModalContent.html"> 
      <input type = "text" ng-model= "ngModel"/> 
     </script> 


     <br />{{ textbox }}   
    </div> 
</div> 

नियंत्रक:

var app = angular.module('app', ['ui.bootstrap']); 

app.controller('ParentController', function ($scope, $modal) { 

    $scope.textbox = {}; 

    // MODAL WINDOW 
    $scope.open = function (_ngModel) { // The ngModel is passed from open() function in template 
     var modalInstance = $modal.open({ 
      templateUrl: 'ModalContent.html', 
      controller: ModalInstanceCtrl, 
      resolve: { 
       ngModel: function() { 
        return _ngModel; 
       } 
      } // end resolve 
     }); 
    }; 
}); 

var ModalInstanceCtrl = function ($scope, $modalInstance, ngModel) { 
    $scope.ngModel = ngModel; 

}; 

2 रास्ता माता पिता और मोडल उदाहरण उपरोक्त कोड में काम नहीं कर के बीच बंधन क्यों isint?

+1

आप वास्तव में दो-तरफा बाध्यकारी होने की अपेक्षा कर रहे हैं, जहां आप '{{textbox}}' प्रिंट कर रहे हैं? यदि ऐसा है, तो आप मोडल में एक बार '$ scope.textbox' पर काम नहीं कर रहे हैं, जब आप इसे '_ngModel' के रूप में पास करते हैं तो आप' $ scope.textbox' की एक प्रति बना रहे हैं और फिर आप मोडल '$ स्कोप 'आइटम' $ scope.ngModel' है ...माता-पिता पर '{{ngModel}}' प्रिंट करने का प्रयास करें और देखें कि – Tom

+0

क्या होता है यह बेहतर है कि मॉड्यूल में विकल्प पैरामीटर के रूप में $ स्कोप पास करना बेहतर है – Armen

+0

@Tom जब मैंने 2 तरीके बाध्यकारी कहा, तो मेरा मतलब क्या है कि मैं टेक्स्ट चाहता हूं माता-पिता और मोडल विंडो में बॉक्स इनपुट को बदलने के लिए यदि इनमें से कोई भी मान बदलता है। उदाहरण के लिए, मेरे उदाहरण में, माता-पिता में 'इनपुट' के लिए एनजी-मॉडल और मोडल विंडो में 'इनपुट' समान है। तो जब मैं पैरेंट 'इनपुट' में कुछ टाइप करता हूं और फिर मोडल खोलता हूं, तो मैं समान मान वाले मोडल' इनपुट' देख सकता हूं। लेकिन जब मैं मोडल इंस्टेंस के 'इनपुट' के अंदर कुछ टाइप करता हूं, तो यह इसे मूल इनपुट पर अपडेट नहीं कर रहा है। जब उन 2 को एक ही एनजी मॉडल द्वारा बाध्य किया जाता है, तो क्या इसे अपडेट नहीं करना चाहिए? – Neel

उत्तर

6

मुझे लगता है कि आप यह धारणा हो कि माता-पिता में ng-model="textbox.sample" और ng-model="ngModel" मोडल में एक ही है क्योंकि आप मोडल को textbox.sample गुजर रहे हैं और आप मोडल विंडो सही मान देखने में सक्षम हो । यह काम करने का एकमात्र कारण यह है कि आप मोडल विंडो खुलने के लिए हर बार $scope.ngModel संपत्ति को स्पष्ट रूप से सेट कर रहे हैं।

इस काम को बनाने का एक तरीका यह है कि आप दोनों जगहों पर $scope.textbox.sample संपत्ति का उपयोग करना चाहते हैं, लेकिन मैं इसकी अनुशंसा नहीं करता।

शायद उचित तरीके modalInstance.result वादा, कुछ इस तरह उपयोग करने के लिए होगा:

मोडल पर एक बटन बना सकते हैं और यह ng-click="ok()"

$scope.ok = function() { 
    $modalInstance.close($scope.ngModal); // will return this to the modalInstance.result 
} 

है और बनाने के तो माता-पिता नियंत्रक, या जो कुछ भी में मोडल विंडो खुलता है:

$scope.open = function (_ngModel) { // The ngModel is passed from open() function in template 
    var modalInstance = $modal.open({ 
     templateUrl: 'ModalContent.html', 
     controller: ModalInstanceCtrl, 
     resolve: { 
      ngModel: function() { 
       return _ngModel; 
      } 
     } // end resolve 
    }); 

    modalInstance.result.then(function (result) { 
     $scope.textbox.sample = result; 
    }); 
}; 
+0

आप बहुत सही हैं। मैंने पूरी तरह से गलत समझा है क्योंकि मैंने सोचा था कि ओपन() के माध्यम से एनजी-मॉडल पास करने से मॉडेल को समान एनजी-मॉडल स्कोप दिया जाएगा और स्वचालित रूप से दोनों मॉडलों को बाध्य किया जाएगा। आपके उत्तरों ने मेरे लिए यह साफ़ कर दिया है। मुझे माता-पिता के एनजी-मॉडल को अपडेट करने और मोडल इंस्टेंस के साथ सिंक करने के लिए 'modalInstance.result' वादे का उपयोग करने के आपके सुझाव से प्यार है। कुल समझ में आता है! मैं इसे अपने कोड पर आज़मा दूंगा और रिपोर्ट करूंगा। – Neel

+0

क्षमा करें मैं फिर से वापस आ गया हूँ। मेरे कोड में अब मैं 'ndalInstance.close' के माध्यम से अद्यतन एनजी-मॉडल पर जा रहा हूं। हालांकि, मुझे वादा को संसाधित करने वाले मूल नियंत्रक में अंतिम कोड जोड़ने में कुछ परेशानी हो रही है। जब मैंने उस कोड को जोड़ा, तो मुझे 'modalInstance परिभाषित नहीं किया गया है' त्रुटि मिल रही है। मुझे लगता है कि मैं इस कोड को अपने मूल नियंत्रक के अंदर गलत स्थान पर रख रहा हूं। क्या यह '$ scope.open' फ़ंक्शन या बाहर के अंदर जाता है? क्या मुझे माता-पिता नियंत्रक में '$ modalInstance' DI जोड़ने की ज़रूरत है? क्षमा करें अगर यह एक बेकार सवाल है। – Neel

+1

हाँ, आपको उसी मोड में 'modalInstance.result' करने की आवश्यकता होगी जिसे आपने' modalInstance', यानी 'var modalInstance = $ modal.open ({...}) परिभाषित किया है; modalInstance.result.then (...) ' – Tom

10

बदलें:

<input type = "text" ng-model= "ngModel"/> 

में:

<input type = "text" ng-model= "$parent.ngModel"/> 

यह ट्रांसक्लुजन से कोई लेना देना नहीं है। जाँच करें: https://github.com/angular-ui/bootstrap/issues/969

+2

आपने अपना दिन बचाया! – greener

+0

धन्यवाद! खुशी हुई मैंने किया! :) –

1

मेरे लिए उपरोक्त में से कोई भी काम नहीं करता है।

इसके बजाय मुझे ऐसा करना था जैसा कि this comment in github में सुझाया गया था।

वेरिएबल को एक ऑब्जेक्ट होना चाहिए, न कि केवल एक साधारण मूल्य।

उदाहरण के लिए, यदि $scope.value काम नहीं करता है, तो यह काम करेगा यदि आप $scope.someObject.value का उपयोग करते हैं।

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