एनजी क्लिक के साथ चेकबॉक्स पर क्लिक करने से मॉडल अपडेट नहीं होता है


85

चेकबॉक्स पर क्लिक करना और एनजी-क्लिक पर कॉल करना: एनजी-क्लिक किक से पहले मॉडल को अपडेट नहीं किया जाता है, इसलिए चेकबॉक्स का मूल्य गलत तरीके से यूआई में प्रस्तुत किया जाता है:

यह AngularJS 1.0.7 में काम करता है और Angualar 1.2-RCx में टूट गया है।

<div ng-app="myApp" ng-controller="Ctrl">
<li  ng-repeat="todo in todos">
  <input type='checkbox' ng-click='onCompleteTodo(todo)' ng-model="todo.done">
    {{todo.text}}
</li> 
<hr>
task: {{todoText}}
<hr><h2>Wrong value</h2>
     done: {{doneAfterClick}}

और नियंत्रक:

angular.module('myApp', [])
  .controller('Ctrl', ['$scope', function($scope) {
    $scope.todos=[
        {'text': "get milk",
         'done': true
         },
        {'text': "get milk2",
         'done': false
         }
        ];


   $scope.onCompleteTodo = function(todo) {
    console.log("onCompleteTodo -done: " + todo.done + " : " + todo.text);
    $scope.doneAfterClick=todo.done;
    $scope.todoText = todo.text;

   };
}]);

टूटी फिडल w / कोणीय 1.2 RCx - http://jsfiddle.net/supercobra/ekD3r/

काम करने की ललक w / कोणीय 1.0.0 - http://jsfiddle.net/supercobra/8FQNw/


3
मेरे लिए भी अब टूट गया है कि मैंने Angular को 1.2+
ac360

V1.2.24 में भी टूट गया।
विंसेंट पी

जवाबों:


165

कैसे बदल रहा है?

<input type='checkbox' ng-click='onCompleteTodo(todo)' ng-model="todo.done">

सेवा

<input type='checkbox' ng-change='onCompleteTodo(todo)' ng-model="todo.done">

से डॉक्स :

उपयोगकर्ता द्वारा इनपुट बदलने पर दी गई अभिव्यक्ति का मूल्यांकन करें। जब मॉडल से मूल्य परिवर्तन आ रहा है तो अभिव्यक्ति का मूल्यांकन नहीं किया जाता है।

ध्यान दें, इस निर्देश को ngModelप्रस्तुत करने की आवश्यकता है।


3
यह भी संस्करण 1.2.7 में टूटा हुआ प्रतीत होता है
JvdBerg

पवित्र लाइटबल्ब, बैटमैन! मुझे लगा कि मैं कुछ और पूरी तरह से गलत कर रहा हूं, लेकिन यह उतना ही सरल था।
एडम मार्शल

1
बहुत मददगार जवाब! +1 कोणीय डॉक -1
न्यूरिक्स

क्या होगा यदि आप को रोकने के लिए इवेंट डेटा की जरूरत है?
user1943442

11

जैसा कि https://github.com/angular/angular.js/issues/4765 में बताया गया है , एनजी-क्लिक से एनजी-परिवर्तन पर स्विच करने से यह ठीक होता है (मैं Angular 1.2.14 का उपयोग कर रहा हूं)


3
सबसे सरल और सबसे आसान फिक्स। +1 से ग्रिफ़िंडर :)
सोमीया कुंबा

9

जिस क्रम में ng-clickऔर जिसको ng-modelक्रियान्वित किया जाएगा वह अस्पष्ट है (क्योंकि न तो स्पष्ट रूप से उनका निर्धारण किया गया है priority)। इसका सबसे स्थिर समाधान एक ही तत्व पर उनका उपयोग करने से बचना होगा।

इसके अलावा, आप शायद उस व्यवहार को नहीं चाहते हैं जो उदाहरण दिखाते हैं; आप केवल चेकबॉक्स ही नहीं, checkboxसंपूर्ण लेबल टेक्स्ट के क्लिक का जवाब देना चाहते हैं । इसलिए, साफ समाधान रैप करने के लिए किया जाएगा input(के साथ ng-modelएक के अंदर) label(साथ ng-click):

<label ng-click="onCompleteTodo(todo)">
  <input type='checkbox' ng-model="todo.done">
  {{todo.text}}
</label>

काम करने का उदाहरण: http://jsfiddle.net/b3NLH/1/


आपका बहुत बहुत धन्यवाद! यह एकमात्र समाधान है जो मेरे लिए काम करता है!
डेनसी

यह समाधान अभी भी सबसे अच्छा है!
एलिसन

8

आप का उपयोग क्यों नहीं करते

$watch('todo',function(.....

या दूसरा समाधान todo.doneएनजी-क्लिक कॉलबैक के अंदर सेट करना होगा और केवल एनजी-क्लिक का उपयोग करना होगा

<div ng-app="myApp" ng-controller="Ctrl">
<li  ng-repeat="todo in todos">
<input type='checkbox' ng-click='onCompleteTodo(todo)'>
    {{todo.text}} {{todo.done}}

तथा

$scope.onCompleteTodo = function(todo) {
        todo.done = !todo.done; //toggle value
        console.log("onCompleteTodo -done: " + todo.done + " : " + todo.text);
        $scope.current = todo;
}

2
@ काकोनी उत्तर देखें, मैंने एनजी-क्लिक के बजाय एनजी-परिवर्तन का उपयोग किया और समय बहुत अच्छा काम करता है। यह आपको दो तरह से बांधने की अनुमति देता है और बहुत क्लीनर दृष्टिकोण है।
माइकल मोजर

6

एनजी-मॉडल की जगह मेरे लिए एनजी-चेक किए गए कार्यों के साथ।


बस मुझे जो चाहिए था। धन्यवाद!
इसहाक

बस यहाँ उपलब्ध सभी समाधानों में से मेरे लिए काम किया।
thatzprem

2

यह एक हैक की तरह है लेकिन इसे टाइमआउट में लपेटने से आप जो चाह रहे हैं उसे पूरा कर सकते हैं:

angular.module('myApp', [])
    .controller('Ctrl', ['$scope', '$timeout', function ($scope, $timeout) {
    $scope.todos = [{
        'text': "get milk",
        'done': true
    }, {
        'text': "get milk2",
            'done': false
    }];

    $scope.onCompleteTodo = function (todo) {
        $timeout(function(){
            console.log("onCompleteTodo -done: " + todo.done + " : " + todo.text);
            $scope.doneAfterClick = todo.done;
            $scope.todoText = todo.text;
        });
    };
}]);

1

के बीच आदेश ng-modelऔर ng-clickअलग हो रहा है और यह कुछ आप शायद पर भरोसा नहीं करना चाहिए। इसके बजाय आप ऐसा कुछ कर सकते हैं:

<div ng-app="myApp" ng-controller="Ctrl">
<li  ng-repeat="todo in todos">
<input type='checkbox' ng-model="todo.done" ng-click='onCompleteTodo(todo)'>
    {{todo.text}} {{todo.done}}
</li> 
    <hr>
        task: {{current.text}}
        <hr>
            <h2>Wrong value</h2>
         done: {{current.done}}
</div>

और आपकी स्क्रिप्ट:

angular.module('myApp', [])
    .controller('Ctrl', ['$scope', function($scope) {

        $scope.todos=[
            {'text': "get milk",
             'done': true
             },
            {'text': "get milk2",
             'done': false
             }
            ];

        $scope.current = $scope.todos[0];


       $scope.onCompleteTodo = function(todo) {
            console.log("onCompleteTodo -done: " + todo.done + " : " + todo.text);
    //$scope.doneAfterClick=todo.done;
    //$scope.todoText = todo.text;
       $scope.current = todo;

   };
}]);

जब भी आप किसी बॉक्स पर क्लिक करते हैं, तो वह भिन्न होता है, यह उस बॉक्स को "वर्तमान" के रूप में सेट करता है और फिर उन मानों को दृश्य में प्रदर्शित करता है। http://jsfiddle.net/QeR7y/


0

आमतौर पर यह आपके एनजी-कंट्रोलर और आपके इनपुट के बीच एक अन्य निर्देश के कारण होता है जो एक नया स्कोप बना रहा है। जब चयनकर्ता इसे मूल्य लिखता है, तो यह इसे सबसे हाल के दायरे तक लिख देगा, इसलिए यह इसे इस दायरे में लिखने की बजाय माता-पिता के लिए है जो आगे है।

सबसे अच्छा अभ्यास एक दायरे में किसी चर पर सीधे नहीं बाँधना है ng-model, इसे हमेशा आपके एनकोडेल में "डॉट" सहित भी जाना जाता है। इसकी बेहतर व्याख्या के लिए, जॉन से इस वीडियो को देखें:

http://www.youtube.com/watch?v=DTx23w4z6Kc

इसका समाधान: https://groups.google.com/forum/# ​​.topic / angular / 7Nd_me5YrHU


यह बहुत अच्छा होगा यदि आप #t=5m08sअपने YouTube लिंक में एक जंप मार्कर प्रदान करते हैं तो यह पूर्ण वीडियो देखने के लिए आवश्यक नहीं है। देखिए matcutts.com/blog/link-to-youtube-minute-second
Volker E.

0

मैं बस के ng-modelसाथ बदल दिया ng-checkedऔर यह मेरे लिए काम किया।

यह समस्या है जब मैं से मेरी कोणीय संस्करण नवीनीकृत किया गया था 1.2.28करने के लिए1.4.9

यह भी जांच लें कि क्या आपका ng-changeकोई मुद्दा यहां पैदा हो रहा है। मुझे ng-changeइसे काम करने के लिए अपना समान भी निकालना पड़ा ।


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