गतिशील रूप से एनजी-मॉडल असाइन करें


82

मैं ऑब्जेक्ट सरणी से चेक-बॉक्स का एक सेट जनरेट करने की कोशिश कर रहा हूं। मैं लक्ष्य-बक्से को गतिशील रूप से उनके एनजी-मॉडल को नए ऑब्जेक्ट की एक संपत्ति में मैप करने का लक्ष्य बना रहा हूं जो कि सरणी में प्रस्तुत किया जाएगा।

मेरे मन में जो था वह कुछ इस तरह है

<li ng-repeat="item in items">
    <label>{{item.name}}</label>
    <input type="checkbox" ng-model="newObject.{{item.name}}">
</li>

यह इस JSFiddle पर देखा जा सकता है के रूप में काम नहीं करता है:

http://jsfiddle.net/GreenGeorge/NKjXB/2/

क्या कोई मदद कर सकता है?

जवाबों:


146

यह आपको वांछित परिणाम देना चाहिए:

<input type="checkbox" ng-model="newObject[item.name]">

यहाँ एक काम कर रहा है: http://plnkr.co/edit/ALHQtkjiUDzZVtTfLIOR?p=preview


1
हम्म वास्तव में यह शाब्दिक रूप से मुझे '<इनपुट एनजी-मॉडल = "newObject [item.name]">> दिया गया है, क्या यह गायब है?
जॉर्ज आनंद इमान

हम्म, अजीब, बस एक जीवित उदाहरण जोड़ा गया है (किसी कारण से junkField आज से मेरी तरफ काम नहीं कर रहा है)।
pkozlowski.opensource

आह हाँ, मुझे php में सोचने की आदत थी और उम्मीद थी कि वास्तविक मार्कअप से नाम बदल जाएगा। धन्यवाद!
जॉर्ज आनंद एमन

2
शानदार, बिल्कुल वही जिसकी मुझे तलाश थी। मैं कोणीय प्यार करता हूँ!
शार्कोमोर्कवुड

1
यह कोणीय 2 में भी काम करता है। लेकिन क्या बहुआयामी वस्तुओं के लिए भी एक समाधान है? अपने उदाहरण में, अगर item.nameकभी-कभी इशारा करना चाहिए newObject['x']और कभी-कभी newObject['x']['y']
मार्टिन श्नाइडर

23

संपादित करें जैसा कि एनजी-परिवर्तन के साथ इसका उपयोग करते हुए टिप्पणियों में सही ढंग से उल्लेख किया गया है, पहले से मौजूद होने के लिए "डमी" एनजी-मॉडल की आवश्यकता है। हालांकि यह ध्यान दिया जाना चाहिए कि जाहिरा तौर पर 1.3 के साथ रूपरेखा द्वारा आवश्यक विकल्प प्रदान किए गए हैं। कृपया नीचे देखें https://stackoverflow.com/a/28365515/3497830 ! / संपादित करें

बस अगर आप मेरे जैसे हैं तो एक साधारण मामले पर अधिक जटिल काम करते हुए लड़खड़ा जाते हैं, यह वह समाधान है जो मैं एनजी-मॉडल के लिए गतिशील रूप से मनमाने ढंग से बंधने के लिए आया हूं: http://plnkr.co/edit/ccdJTmT.zBnqjntEQfAfx?p?p = पूर्वावलोकन

विधि: मैंने एक डाइनेमिक डायनामोडेल बनाया है जो एक मानक कोणीय अभिव्यक्ति लेता है, इसका मूल्यांकन करता है और परिणाम को एनजी-मॉडल और $ संकलन के माध्यम से दायरे से जोड़ता है।

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

app.controller('MainCtrl', function($scope) {
  $scope.data = {};
  $scope.testvalue = 'data.foo';
  $scope.eval = $scope.$eval;
});

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

app.controller('MainCtrl', function($scope) {
  $scope.data = {};
  $scope.testvalue = 'data.foo';
  $scope.eval = $scope.$eval;
});

app.directive('dynamicModel', ['$compile', function ($compile) {
    return {
        'link': function(scope, element, attrs) {
            scope.$watch(attrs.dynamicModel, function(dynamicModel) {
                if (attrs.ngModel == dynamicModel || !dynamicModel) return;

                element.attr('ng-model', dynamicModel);
                if (dynamicModel == '') {
                    element.removeAttr('ng-model');
                }

                // Unbind all previous event handlers, this is 
                // necessary to remove previously linked models.
                element.unbind();
                $compile(element)(scope);
            });
        }
    };
}]);

उपयोग केवल डायनेमिक-मॉडल = "कोणीय एक्सप्रेशन" है जहां कोणीय एक्सप्रेशन एक स्ट्रिंग में परिणाम देता है जो एनजी-मॉडल के लिए अभिव्यक्ति के रूप में उपयोग किया जाता है।

मुझे आशा है कि यह किसी को इस समाधान के साथ आने के सिरदर्द को बचाता है।

सादर, जस्टस


3
आप एक जीवन रक्षक हैं। मैं इस पद को पाने से पहले लगभग निराश था।
नेल्लो मितानिम

क्या आप अधिक विशिष्ट ब्रायन हो सकते हैं? आपने क्या प्रयास किया और क्या हुआ?
जस्टस विंगर्ट

यह एक समाधान का एक प्रतियोगिता रत्न है। आपने मुझे एक बहुत ही चिपचिपे मुद्दे से बाहर निकाल दिया - धन्यवाद!
मिकबर्ट 4

1
एनजी-परिवर्तन इसके साथ काम नहीं करता है। यदि आप कोणीय स्रोत में देखते हैं, तो ngChange निर्देश में एक आवश्यक निर्देश के रूप में ngModel है। एक त्वरित खोज केवल ngChange दिखाता है और ngList के पास यह समस्या है। अन्य सभी निर्देशों में एक वैकल्पिक नियंत्रक के रूप में एनकोमॉडल लगता है। मैंने डायनेमिक-मॉडल निर्देश का उपयोग करके किसी भी तत्व में एनजी-मॉडल = "डमीवैल्यू" जोड़कर इस समस्या के आसपास काम किया। चूंकि डायनामिक-मॉडल कॉल में परिवर्तन $ संकलन, एनजीचेंज और एनजी-मॉडल मूल्य का उपयोग करने वाले किसी भी अन्य निर्देश को सही ढंग से अपडेट किया जाता है।
एवरपर्सेंट

1
यह एक अधिक मजबूत समाधान है, जब आपको डायनेमिक-मॉडल मान को बदलते हुए देखने की ज़रूरत नहीं है - stackoverflow.com/a/32096328/887092
टोड

6

कोणीय 1.3 के साथ, आप ng-model-optionsमॉडल को गतिशील रूप से असाइन करने के लिए निर्देश का उपयोग कर सकते हैं , या अभिव्यक्ति के लिए बाध्य कर सकते हैं ।

यहाँ एक प्लंकर है: http://plnkr.co/edit/65EBiySUc1iWCWG6Ov98?p=preview

<input type="text" ng-model="name"><br>
<input type="text" ng-model="user.name" 
ng-model-options="{ getterSetter: true }">

ngModelOptionsयहाँ पर अधिक जानकारी : https://docs.angularjs.org/api/ng/directive/ngModelOptions


मुझे माफ कर दो अगर मुझे कुछ याद आ रहा है, लेकिन आपके प्लंक के बारे में कुछ भी नहीं है जिसमें डायनेमिक मॉडल असाइनमेंट शामिल है। और ngModelOptions के बारे में कुछ भी स्पष्ट रूप से समर्थन नहीं करेगा। आप शायद स्पष्ट कर सकते हैं? क्योंकि यह सुपर-उपयोगी होगा यदि यह वास्तव में, इस तरह से काम करता है ...
XML

@XMLilley "getterSetter: बूलियन वैल्यू जो निर्धारित करती है कि एनकाउंटर करने वाले कार्यों को गेटर्स / सेटर्स के रूप में किया जाए या नहीं।"
क्रिस बोल्टन

इसे मेरे ध्यान में लाने के लिए धन्यवाद, मैंने अपना उत्तर अपडेट किया है और आपसे जुड़ा हुआ हूं।
जस्टस विंगर्ट

1

यह गहरी अभिव्यक्ति का समर्थन करने के लिए मेरा दृष्टिकोण है, उदाहरण के लिए 'model.level1.level2.value'

<input class="form-control" ng-model="Utility.safePath(model, item.modelPath).value">

जहां item.modelPath = 'level1.level2' और उपयोगिता (मॉडल, 'level1.level2') उपयोगिता फ़ंक्शन है जो model.level1.level2 लौटाता है


क्या आप इस बात पर विस्तार कर सकते हैं कि यह कैसे काम करता है? क्या उपयोगिता है। कैफे ऐसे लौटाता है कि आप तब उपयोग कर सकते हैं।
डेवोन होल्कोम्बे

यूटिलिटी.safePath पथ स्ट्रिंग द्वारा निर्दिष्ट नेस्टेड चर का मान लौटाता है। उदा। level1.level2 model.level1.level2 को संदर्भित करता है।
कानित मेक्त्रिकराय

0

<!DOCTYPE html>
<html>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script>
<body>

    <div ng-app="myApp" ng-controller="myCtrl">
        <form name="priceForm" ng-submit="submitPriceForm()">
            <div ng-repeat="x in [].constructor(9) track by $index">
                <label>
                    Person {{$index+1}} <span class="warning-text">*</span>
                </label>
                <input type="number" class="form-control" name="person{{$index+1}}" ng-model="price['person'+($index+1)]" />

            </div>
            <button>Save</button>
        </form>
    </div>

    <script>
        var app = angular.module('myApp', []);
        app.controller('myCtrl', function ($scope) {
            $scope.price = [];
            $scope.submitPriceForm = function () {
                //objects be like $scope.price=[{person1:value},{person2:value}....]
                console.log($scope.price);
            }
        });
    </script>
</body>
</html>

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