এনজি-ক্লিক দিয়ে একটি চেকবক্স ক্লিক করা মডেলটি আপডেট করে না


85

একটি চেকবক্সে ক্লিক করা এবং এনজি-ক্লিক কল করা: এনজি-ক্লিক কিক্সের আগে মডেলটি আপডেট হয় না তাই চেকবক্স মানটি ইউআইতে ভুলভাবে উপস্থাপন করা হয়:

এটি অ্যাঙ্গুলারজেএস 1.0.7 এ কাজ করে এবং অ্যাঙ্গুয়ালার 1.2-আরসিএক্সে ভাঙ্গা মনে হচ্ছে।

<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;

   };
}]);

ব্রোকন ফিডল ডাব্লু / কৌণিক 1.2 1.2 আরসিএক্স - http://jsfiddle.net/supercobra/ekD3r/

ফিডডল ডাব্লু / কৌণিক 1.0.0 কাজ করছে - http://jsfiddle.net/supercobra/8FQNw/


4
আমার জন্য এখনই ভেঙে গেছে যে আমি
কৌনিকটি 1.2+

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উপস্থিত থাকা প্রয়োজন।


4
এটি 1.2.7 সংস্করণেও নষ্ট হয়ে গেছে বলে মনে হচ্ছে
JvdBerg

পবিত্র লাইটবুলব, ব্যাটম্যান! আমি ভেবেছিলাম যে আমি অন্য কোনও কিছু পুরোপুরি ভুল করছি, তবে এটি এতটা সহজ বলে প্রমাণিত হয়েছিল।
অ্যাডাম মার্শাল

4
খুব সহায়ক উত্তর! +1 কৌণিক ডক -1
নিউরিক্স

ডেফল্ট প্রতিরোধের জন্য আপনার যদি ইভেন্টের ডেটা দরকার হয়?
ব্যবহারকারী 1943442

11

Https://github.com/angular/angular.js/issues/4765 তে উল্লিখিত হিসাবে , এনজি-ক্লিক থেকে এনজি-চেঞ্জে স্যুইচ করা এইটিকে ঠিক করতে পারে বলে মনে হচ্ছে (আমি কৌনিক 1.2.14 ব্যবহার করছি)


4
সবচেয়ে সহজ এবং সহজ সমাধান। গ্রিফিন্ডোরকে +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;
}

4
@ কাকোনির উত্তর দেখুন, আমি এনজি-ক্লিকের পরিবর্তে এনজি-পরিবর্তন ব্যবহার করেছি এবং সময়টি দুর্দান্ত কাজ করে। এটি আপনাকে দ্বিপথকে বাধ্যতামূলক রাখতে দেয় এবং এটি আরও পরিচ্ছন্ন পদ্ধতির।
মাইকেল মোসার

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যদি আপনার ইউটিউব লিঙ্কে একটি জাম্প মার্কার সরবরাহ করেন তবে দুর্দান্ত লাগবে যাতে সম্পূর্ণ ভিডিওটি দেখার প্রয়োজন হয় না। দেখুন mattcutts.com/blog/link-to-youtube-minute-second
Volker ই

0

আমি সবেমাত্র প্রতিস্থাপন ng-modelকরেছি ng-checkedএবং এটি আমার পক্ষে কাজ করেছে।

এই সমস্যা যখন আমি আমার কৌণিক সংস্করণে আপডেট করা ছিল 1.2.28থেকে1.4.9

আপনার ng-changeএখানে কোনও সমস্যা হচ্ছে কিনা তাও পরীক্ষা করে দেখুন । ng-changeএটিকে কাজ করতে আমাকে আমার ভাল করে ফেলতে হয়েছিল।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.