कोणीय यूआई मोडल के साथ स्कोप मुद्दे


80

मुझे कोणीय यूआई मोडल के लिए स्कोप को समझने / उपयोग करने में परेशानी हो रही है।

यहां तुरंत स्पष्ट नहीं होने के दौरान, मेरे पास मॉड्यूल और सब कुछ सही तरीके से सेट है (जहां तक ​​मैं बता सकता हूं), लेकिन विशेष रूप से ये कोड नमूने हैं जहां मैं बग ढूंढ रहा हूं।

index.html (इसका महत्वपूर्ण भाग)

<div class="btn-group">
    <button class="btn dropdown-toggle btn-mini" data-toggle="dropdown">
        Actions
        <span class="caret"></span>
    </button>
    <ul class="dropdown-menu pull-right text-left">
        <li><a ng-click="addSimpleGroup()">Add Simple</a></li>
        <li><a ng-click="open()">Add Custom</a></li>
        <li class="divider"></li>
        <li><a ng-click="doBulkDelete()">Remove Selected</a></li>
    </ul>
</div>

नियंत्रक (js) (फिर से, महत्वपूर्ण हिस्सा)

MyApp.controller('AppListCtrl', function($scope, $modal){
    $scope.name = 'New Name';
    $scope.groupType = 'New Type';

    $scope.open = function(){
        var modalInstance = $modal.open({
            templateUrl: 'partials/create.html',
            controller: 'AppCreateCtrl'
        });
        modalInstance.result.then(function(response){

            // outputs an object {name: 'Custom Name', groupType: 'Custom Type'}
            // despite the user entering customized values
            console.log('response', response);

            // outputs "New Name", which is fine, makes sense to me.                
            console.log('name', $scope.name);

        });
    };
});

MyApp.controller('AppCreateCtrl', function($scope, $modalInstance){
    $scope.name = 'Custom Name';
    $scope.groupType = 'Custom Type';

    $scope.ok = function(){

        // outputs 'Custom Name' despite user entering "TEST 1"
        console.log('create name', $scope.name);

        // outputs 'Custom Type' despite user entering "TEST 2"
        console.log('create type', $scope.groupType);

        // outputs the $scope for AppCreateCtrl but name and groupType
        // still show as "Custom Name" and "Custom Type"
        // $scope.$id is "007"
        console.log('scope', $scope);

        // outputs what looks like the scope, but in this object the
        // values for name and groupType are "TEST 1" and "TEST 2" as expected.
        // this.$id is set to "009" so this != $scope
        console.log('this', this);

        // based on what modalInstance.result.then() is saying,
        // the values that are in this object are the original $scope ones
        // not the ones the user has just entered in the UI. no data binding?
        $modalInstance.close({
            name: $scope.name,
            groupType: $scope.groupType
        });
    };
});

create.html (इसकी संपूर्णता में)

<div class="modal-header">
    <button type="button" class="close" ng-click="cancel()">x</button>
    <h3 id="myModalLabel">Add Template Group</h3>
</div>
<div class="modal-body">
    <form>
        <fieldset>
            <label for="name">Group Name:</label>
            <input type="text" name="name" ng-model="name" />           
            <label for="groupType">Group Type:</label>
            <input type="text" name="groupType" ng-model="groupType" />
        </fieldset>
    </form>
</div>
<div class="modal-footer">
    <button class="btn" ng-click="cancel()">Cancel</button>
    <button class="btn btn-primary" ng-click="ok()">Add</button>
</div>

तो, मेरा सवाल यह है: यूआई के लिए गुंजाइश दोगुनी क्यों नहीं है? और क्यों thisअनुकूलित मान है, लेकिन $scopeनहीं करता है?

मैंने ng-controller="AppCreateCtrl"create.html में बॉडी डी.वी.

इस बिंदु पर, मेरी ही एकमात्र विकल्प के साथ एक वस्तु वापस पारित करने के लिए है this.nameऔर this.groupTypeउपयोग करने के बजाय $scope, लेकिन यह गलत लगता है।


अच्छा मोडल स्कोप चर्चा यहाँ: github.com/mgcrea/angular-strap/issues/14
2:02 पर

जवाबों:


60

मुझे इस तरह से काम करने का मौका मिला:

var modalInstance = $modal.open({
  templateUrl: 'partials/create.html',
  controller: 'AppCreateCtrl',
  scope: $scope // <-- I added this
});

कोई रूप नाम नहीं, नहीं $parent। मैं AngularUI बूटस्ट्रैप संस्करण 0.12.1 का उपयोग कर रहा हूं।

मैं इसके द्वारा इस समाधान के लिए इत्तला दे दी गई थी ।


यह काफी बेहतर उपाय है। बहुत क्लीनर। हमने अभी हाल ही में 0.12.1 में अपग्रेड किया है और वर्तमान में इसके द्वारा किए गए ब्रेकिंग परिवर्तनों को ठीक कर रहे हैं। मैं इसे सूची में जोड़ सकता हूं। धन्यवाद!!
coblr

मैं इस जवाब को स्वीकार कर रहा हूं क्योंकि यह वर्तमान कार्यान्वयन है और उन लोगों के लिए अधिक उपयोगी होगा जो यहां काम करने की कोशिश कर रहे हैं। जब तक आप कोणीय यूआई के नवीनतम (~ 0.12) संस्करण का उपयोग नहीं कर रहे हैं, कृपया पूरा धागा पढ़ें।
coblr

मोडल $ modalStack के साथ बंद होने के लिए प्रतीत नहीं होता है अगर राज्य बदल गया है अगर गुंजाइश सेट है
फेजी

नमस्ते, इससे थोड़ी देर के लिए मेरी समस्या हल हो गई, लेकिन एक अजीब बात पर ध्यान दिया जब मोडल / डायलॉग को बंद करते हुए, सामग्री बदल रही थी और यह एक स्कोप ऑब्जेक्ट पर कुछ गड़बड़ करने लगा। जोड़ने की गुंजाइश: $ गुंजाइश, संरक्षित करेंस्कोप: सच // <- महत्वपूर्ण किसी तरह मदद की! संपूर्ण निश्चित नहीं कि क्यों, लेकिन इसे सामग्री पर पाया गया ।angularjs.org/ latest/ api/ service/… संपादित करें: मुझे पता चला कि क्यों। जब आप स्कोप सेट करते हैं: डायलॉग के लिए, और फिर डायलॉग को बंद करें "यह स्कोप तब नष्ट हो जाएगा जब नीचे की शीट को हटा दिया जाता है जब तक कि प्रीस्कॉरस्कोप को सही पर सेट नहीं किया जाता है।"
मैक्स

मेरे नियंत्रक में, मैं vm = इस का उपयोग कर रहा हूं। मैं $ गुंजाइश का उपयोग नहीं कर रहा हूँ। तो फिर मुझे क्या करना चाहिए?
अंकित प्रजापति

66

जब नेस्टेड स्कोप शामिल होते हैं, तो <input>सीधे दायरे के सदस्यों से बंधे नहीं होते हैं :

<input ng-model="name" /> <!-- NO -->

उन्हें कम से कम एक गहरे स्तर तक बांधें:

<input ng-model="form.name" /> <!-- YES -->

इसका कारण यह है कि स्कोप्स मूल रूप से अपने मूल दायरे को विरासत में लेते हैं। इसलिए 1 स्तर के सदस्यों को सेट करते समय, ये सीधे माता-पिता को प्रभावित किए बिना, बच्चे के दायरे में सेट किए जाते हैं। इसके विपरीत, जब नेस्टेड फ़ील्ड ( form.name) में सदस्य formको पैरेंट स्कोप से पढ़ा जाता है, तो nameप्रॉपर्टी को एक्सेस करना सही लक्ष्य तक पहुंच जाता है।

अधिक विस्तृत विवरण यहां पढ़ें ।


14
इसे 'form.name' में बदलते समय कुछ नहीं किया, इसे ng-model में बदलकर = "$ parent.name" ने समस्या को ठीक कर दिया। धन्यवाद! (और साथ ही पढ़ने की सामग्री के लिए धन्यवाद। यह अभी तक नहीं देखा है।)
coblr

1
आप का उपयोग करते हैं controller asतो वाक्य रचना आप इस तरह नेस्टेड गुंजाइश मुद्दों में नहीं चलेंगे
लूटने

controller as वाक्यविन्यास क्या है ?
adrianboimvaser

1
Docs.angularjs.org/api/ng.directive:ngController देखें । मूल रूप से एनजी-नियंत्रक = "माईकटल के रूप में मेरा" फिर एक एनजी-मॉडल को संदर्भित करता है जैसे my.someVar
रयान क्यू

2
@ निकोस पारसकेवोपोलोस, "फ़ॉर्म.नाम" क्या दर्शाता है? यह प्रदान किए गए कोड में बिल्कुल उल्लेख नहीं है!
atुकास्ज़बचमैन

7

अद्यतन नवंबर 2014 :

वास्तव में आपके कोड को ui-बूटस्ट्रैप 0.12.0 में अपग्रेड करने के बाद काम करना चाहिए। ट्रांसकोड किए गए स्कोप को कंट्रोलर के स्कोप के साथ मिला दिया जाता है ताकि किसी सामान $parentया form.सामान की जरूरत न पड़े ।

0.12.0 से पहले :

अपनी सामग्री सम्मिलित करने के लिए मोडल ट्रांसकॉर्पोरेशन का उपयोग करता है। आपके लिए धन्यवाद विशेषता ngFormद्वारा गुंजाइश को नियंत्रित कर सकता है name। इसलिए ट्रांसकोड किए गए दायरे से बचने के लिए बस फॉर्म को इस तरह से संशोधित करें:

<form name="$parent">

या

<form name="$parent.myFormData">

मॉडल डेटा नियंत्रक दायरे में उपलब्ध होगा।


स्पष्ट होने के लिए, क्या आप कह रहे हैं कि आपके द्वारा कॉल किए $modalजा रहे नियंत्रक का दायरा मोडल को निर्दिष्ट नियंत्रक के लिए उपलब्ध होना चाहिए?
जेसन स्वेट 14

नहीं, समस्या यह थी कि मोडल इंस्टेंस कंट्रोलर भी फॉर्म के लिए आसानी से उपलब्ध नहीं थे। नियंत्रक का उपयोग करने के लिए जो केवल scope:$scope$ modal.open params मानचित्र में रखे गए मॉडल को खोलता है ।
गर्टास

क्या आपका मतलब है Angular UI? क्या UI बूटस्ट्रैप से अलग है?
नूह

1
$scope.open = function () {

          var modalInstance = $uibModal.open({
              animation: $scope.animationsEnabled,
              templateUrl: 'myModalContent.html',
              controller: 'salespersonReportController',
              //size: size
              scope: $scope
            });

      };

यह मेरे लिए काम करता है गुंजाइश: $ गुंजाइश धन्यवाद यू जेसन Swett


1

मैं गुंजाइश जोड़: $ गुंजाइश तो यह काम करता है। कूल

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.