ใน AngularJS ความแตกต่างระหว่าง ng-pristine และ ng-dirty คืออะไร?


110

อะไรคือความแตกต่างระหว่างng-pristineและng-dirty? ดูเหมือนว่าคุณสามารถมีได้ทั้งสองอย่างtrue:

$scope.myForm.$pristine = true; // after editing the form

คำตอบ:


214

ng-dirtyชั้นจะบอกคุณว่ารูปแบบได้รับการแก้ไขโดยผู้ใช้ในขณะที่ng-pristineชั้นบอกคุณว่ารูปแบบยังไม่ได้รับการแก้ไขโดยผู้ใช้ ดังนั้นng-dirtyและng-pristineทั้งสองด้านของเรื่องเดียวกัน

เรียนตั้งอยู่บนเขตข้อมูลใด ๆ ในขณะที่รูปแบบมีสองคุณสมบัติและ$dirty$pristine

คุณสามารถใช้$scope.form.$setPristine()ฟังก์ชั่นเพื่อรีเซ็ตฟอร์มเป็นสถานะเก่า (โปรดทราบว่านี่คือคุณสมบัติ AngularJS 1.1.x)

หากคุณต้องการ$scope.form.$setPristine()พฤติกรรม -ish แม้ในสาขา 1.0.x ของ AngularJS คุณต้องม้วนโซลูชันของคุณเอง (สามารถพบได้ที่นี่ ) โดยทั่วไปที่นี้หมายถึงการทำซ้ำมากกว่าเขตทุกรูปแบบและการตั้งค่าของพวกเขาธง$dirtyfalse

หวังว่านี่จะช่วยได้


2
คำตอบที่ดี แต่ทำไม 2 ชั้นถ้าเป็นสองด้านของเรื่องเดียวกัน? อย่างที่บอกไปว่าคุณสามารถมีได้ทั้งสองอย่างเป็นจริงหรือเท็จ
synergetic

6
ถูกต้อง แต่ฉันเดา (กลัว) ว่านี่เป็นคำถามที่นักพัฒนา AngularJS เท่านั้นที่สามารถตอบได้ กล่าวอีกนัยหนึ่ง: ฉันไม่รู้
Golo Roden

2
@synergetic มันก็เหมือนกับ ng-show และ ng-hide โดยทั่วไปหนึ่งก็เพียงพอแล้ว แต่เรามีสองอย่างโดยไม่มีเหตุผลที่มองเห็นได้
Labib Ismaiel

1
@synergetic ng-show นั้นเข้าใจง่ายกว่าเชิงความหมายและต้องใช้ขั้นตอนการรับรู้น้อยกว่าเพียงขั้นตอนเดียวในการทำความเข้าใจมากกว่า! ng-hide สมองของคุณต้องทำขั้นตอนพิเศษนั้นและทำให้คุณมีแนวโน้มที่จะแนะนำจุดบกพร่องมากขึ้น
Damian Green

4
ฉันคิดว่ามันขึ้นอยู่กับเจตนาของคุณ: บางครั้งคุณต้องการแสดงสิ่งอื่น ๆ เพิ่มเติมตามสถานการณ์ที่เฉพาะเจาะจงและบางครั้งคุณต้องซ่อนบางสิ่งบางอย่างตามสถานการณ์ที่เฉพาะเจาะจง ขึ้นอยู่กับกรณีการใช้งานของคุณทั้งสองอย่างอาจเหมาะสม แน่นอนแม้ว่าในทางเทคนิคจะเหมือนกัน แต่ก็ไม่ได้ตั้งใจ
Golo Roden

41

pristine บอกเราว่าเขตข้อมูลยังบริสุทธิ์อยู่หรือไม่และสิ่งสกปรกจะบอกเราว่าผู้ใช้พิมพ์อะไรในช่องที่เกี่ยวข้องแล้วหรือไม่:

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.min.js"></script>
<form ng-app="" name="myForm">
  <input name="email" ng-model="data.email">
  <div class="info" ng-show="myForm.email.$pristine">
    Email is virgine.
  </div>
  <div class="error" ng-show="myForm.email.$dirty">
    E-mail is dirty
  </div>
</form>

ฟิลด์ที่ลงทะเบียนเหตุการณ์คีย์ดาวน์เพียงครั้งเดียวจะไม่มีความบริสุทธิ์อีกต่อไป (ไม่เก่าแก่อีกต่อไป) ดังนั้นจึงสกปรกตลอดไป


วิธีการวางเมาส์?
Mihai Răducanu

2
นี่ไม่ได้อธิบายอะไร คำถามคือ 'อะไรคือความแตกต่าง' ไม่มีคำอธิบายว่าคุณหมายถึงพรหมจารีและความหมายของสกปรก
hogan

34

เห็นได้ชัดว่าคำสั่งทั้งสองตอบสนองจุดประสงค์เดียวกันและแม้ว่าดูเหมือนว่าการตัดสินใจของทีมเชิงมุมที่จะรวมทั้งการแทรกแซงหลักการ DRY และเพิ่มน้ำหนักบรรทุกของหน้า แต่ก็ยังค่อนข้างเป็นประโยชน์ที่จะให้ทั้งคู่อยู่ด้วยกัน มันง่ายกว่าในการจัดรูปแบบองค์ประกอบอินพุตของคุณเนื่องจากคุณมีทั้ง .ng-pristine และ .ng-dirty สำหรับจัดแต่งทรงผมในไฟล์ css ของคุณ ฉันเดาว่านี่เป็นเหตุผลหลักในการเพิ่มทั้งสองคำสั่ง


19
+1 สำหรับข้อเท็จจริง.ng-pristineและ.ng-dirtyอนุญาตให้ใช้สไตล์ css ที่แตกต่างกัน - นี่เป็นเหตุผลที่ถูกต้องที่สุดที่อยู่เบื้องหลังการเปลี่ยนกลับ
Steve Lorimer

10

ตามที่ระบุไว้แล้วในคำตอบก่อนหน้านี้ng-pristineมีไว้เพื่อระบุว่าฟิลด์ไม่ได้รับการแก้ไขในขณะที่ng-dirtyบอกว่ามีการแก้ไขแล้ว ทำไมต้องทั้งสองอย่าง?

สมมติว่าเรามีแบบฟอร์มที่มีโทรศัพท์และที่อยู่อีเมลในช่องต่างๆ จำเป็นต้องใช้โทรศัพท์หรืออีเมลและคุณต้องแจ้งให้ผู้ใช้ทราบเมื่อมีข้อมูลที่ไม่ถูกต้องในแต่ละช่อง สิ่งนี้สามารถทำได้โดยใช้ng-dirtyและng-pristineร่วมกัน:

<form name="myForm">
    <input name="email" ng-model="data.email" ng-required="!data.phone">
    <div class="error" 
         ng-show="myForm.email.$invalid && 
                  myForm.email.$pristine &&
                  myForm.phone.$pristine">Phone or e-mail required</div>
    <div class="error" 
         ng-show="myForm.email.$invalid && myForm.email.$dirty">
        E-mail is invalid
    </div>

    <input name="phone" ng-model="data.phone" ng-required="!data.email">
    <div class="error" 
         ng-show="myForm.phone.$invalid && 
                  myForm.email.$pristine &&
                  myForm.phone.$pristine">Phone or e-mail required</div>
    <div class="error" 
         ng-show="myForm.phone.$invalid && myForm.phone.$dirty">
        Phone is invalid
    </div>
</form>

1

ng-pristine (ดั้งเดิม $)

Boolean True หากยังไม่ได้ใช้รูปแบบ / อินพุต ( ไม่ได้แก้ไขโดยผู้ใช้ )

ng-dirty (สกปรก $)

Boolean True หากมีการใช้รูปแบบ / อินพุต ( แก้ไขโดยผู้ใช้ )


$ setDirty (); ตั้งค่าแบบฟอร์มเป็นสถานะสกปรก วิธีนี้สามารถเรียกได้ว่าเพิ่มคลาส 'ng-dirty' และตั้งค่าแบบฟอร์มเป็นสถานะสกปรก (คลาส ng-dirty) วิธีนี้จะเผยแพร่สถานะปัจจุบันไปยังฟอร์มหลัก

$ setPristine (); ตั้งค่าแบบฟอร์มเป็นสถานะที่บริสุทธิ์ วิธีนี้ตั้งค่าสถานะ $ pristine ของแบบฟอร์มเป็นจริงสถานะสกปรก $ เป็นเท็จลบคลาส ng-dirty และเพิ่มคลาส ng-pristine นอกจากนี้ยังตั้งค่าสถานะที่ $ ส่งเป็นเท็จ วิธีนี้จะเผยแพร่ไปยังตัวควบคุมทั้งหมดที่มีอยู่ในแบบฟอร์มนี้

การตั้งค่าฟอร์มให้กลับสู่สถานะที่บริสุทธิ์มักจะมีประโยชน์เมื่อเราต้องการ 'ใช้ซ้ำ' แบบฟอร์มหลังจากบันทึกหรือรีเซ็ต

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.