ข้อขัดแย้งในการทริกเกอร์ช่วงการคลิกและดูลำดับเหตุการณ์ในกล่องข้อความและรุ่นกล่องกาเครื่องหมายในแอปพลิเคชัน Angularjs

ฉันกำลังสร้างนาฬิกาบนกล่องข้อความและกล่องกาเครื่องหมายเพื่อเรียกใช้ฟังก์ชันที่ฉันกำหนดเอง เนื่องจากฉันไม่ต้องการเรียกใช้ฟังก์ชันที่กำหนดเองของฉันภายในนาฬิการะหว่างการโหลดข้อมูลครั้งแรก ภายในนาฬิกา ฉันจึงขึ้นอยู่กับแฟล็ก needwatch เมื่อใดจึงจะเรียกใช้ฟังก์ชันที่ฉันกำหนดไว้เอง เพื่อจุดประสงค์นี้ ฉันเก็บทั้งกล่องกาเครื่องหมายและกล่องข้อความไว้ในองค์ประกอบ span และเมื่อมีการคลิก span ฉันกำลังทำให้แฟล็ก needWatch นั้นเป็นจริง เพื่อว่าฟังก์ชันแบบกำหนดเองจะถูกเรียกเมื่อโมเดลนั้นมีการเปลี่ยนแปลง เพื่อให้ฟังก์ชันแบบกำหนดเองนี้ จะไม่ถูกเรียกระหว่างการโหลดข้อมูลครั้งแรก ตรรกะนี้ทำงานได้ดีสำหรับกล่องข้อความ (แม้จะเลือกแบบเลื่อนลง) แต่ล้มเหลวในกล่องกาเครื่องหมาย

เหตุผลก็คือ สำหรับกล่องข้อความ เสมอ เหตุการณ์ span ng-click จะถูกทริกเกอร์ก่อน จากนั้นฟังก์ชันนาฬิกาในรุ่นกล่องข้อความจะเริ่มทำงานในลำดับถัดไป สำหรับกล่องกาเครื่องหมาย โดยการสุ่ม ฟังก์ชั่นนาฬิกาจะเริ่มทำงานก่อน จากนั้นเหตุการณ์ span ng-click จะเริ่มขึ้นถัดไปและในทางกลับกัน

ฉันต้องการช่องทำเครื่องหมายเสมอ เหตุการณ์ span ng-click จะถูกทริกเกอร์ก่อน แทนที่จะเป็นฟังก์ชันนาฬิการุ่น เป็นไปได้ไหม?

โปรดค้นหา phunker แล้วลองเปลี่ยนกล่องข้อความและค่าของช่องทำเครื่องหมาย


person Madasu K    schedule 28.10.2015    source แหล่งที่มา


คำตอบ (2)


มีปัญหาบางอย่างที่คุณไม่ได้กล่าวถึง เช่น: -ฉันสามารถป้อนข้อความได้โดยไม่ต้องคลิก (ใช้แท็บแทน)

ดังนั้นควรใช้ ng-change ดีกว่า แล้วคุณจะไม่ต้องเสียเวลา needWatch หรือทำให้นาฬิกาทำงานดังนี้:

 $scope.$watch('checkboxModel', function(newval, oldval) {
   if (newval != oldval) {
       console.log('watch', newval, oldval);
   }
 }, true); 
person Petr Averyanov    schedule 28.10.2015

ใน Angular ผู้ฟัง $watch จะถูกส่งผ่านค่า newValue และค่า oldValue ที่เป็นตัวหนาสำหรับนิพจน์ watch

หากเป้าหมายคือการหลีกเลี่ยงการรันฟังก์ชันแบบกำหนดเองของคุณในระหว่างการเริ่มต้น ให้เปรียบเทียบค่าของ oldValue และ newValue หากเท่ากัน นาฬิกาจะถูกเรียกในระหว่างการเริ่มต้น และฟังก์ชันที่คุณกำหนดเองไม่ควรทำงาน

เอกสารเชิงมุมแนะนำว่านี่เป็นวิธีมาตรฐานในการจัดการวงจรการเริ่มต้น: https://docs.angularjs.org/api/ng/type/$rootScope.Scope

ตัวอย่าง:

$scope.model = { textbox: '', checkbox: false };

$scope.$watch( 'model.textbox', function( newValue, oldValue {
    if( newValue === oldValue )
        return;

    customFunction( newValue );
});

$scope.$watch( 'model.checkbox', function( newValue, oldValue ){
    if( newValue === oldValue )
        return;

    customFunction( newValue );
});

function customFunction( value ){
    console.log( "new value: " + value );
}
person Brian    schedule 28.10.2015