เหตุใด ng-show จึงเข้าสู่วงวนไม่สิ้นสุดเมื่อทำการโทรแบบอะซิงโครนัสใน เชิงมุม?

ฉันได้วินิจฉัยปัญหาในการใช้ ng-show เมื่อใช้การโทรแบบอะซิงโครนัส โดยเฉพาะการใช้ไลบรารีไคลเอนต์ Google Javascript - gapi

ฉันมีสิ่งนี้ในหน้า Partials/html ในแอปเชิงมุมของฉัน ฉันจะใช้ ng-show ดังนี้ นี่คือที่ฉันเรียก ng-show:

<div ng-show="isRegistered()"></div>

เมื่อใช้การทดสอบแบตเตอรี่ ng-show ไม่ จะวนซ้ำไม่รู้จบเมื่อฉันเพียงแค่ทำการส่งคืนค่าบูลีน ตัวอย่างเช่น:

$scope.isRegistered = function () {
$scope.test = false;
return $scope.test;};

นอกจากนี้ ไม่มีการวนซ้ำไม่มีที่สิ้นสุด เมื่อฉันไปที่ฟังก์ชันอื่นและสลับ $scope.test เป็นจริงหรือเท็จอย่างไม่มีกำหนดโดยใช้กล่องกาเครื่องหมายง่ายๆ

ปัญหาของการวนซ้ำไม่รู้จบนี้เริ่มต้นทันทีที่การกลับมาของฉันขึ้นอยู่กับการโทรแบบอะซิงโครนัสบางประเภทดังนี้:

    $scope.isRegistered = function () {
      $scope.test=false;

      var joe = function () {
      var deferred = $q.defer();
      gapi
      .client
      .conference
      .isRegistered()
      .execute(function (res) {
        $scope.$apply(function () {
          if (res.error) {
            $log.error('There was an Error');
            deferred.reject(res.error);
          }
          else {
            $log.info("Success");
            deferred.resolve(res.data);
          }
        });
      });
      return deferred.promise;
      };

    joe()
      .then(function (data) {
        $log.info("Got some data", data);
        $log.info("testing");
        $scope.test = data;
        $log.info($scope.test);
      });

    $log.info($scope.test);
    return $scope.test;

};

มันยังคงส่งออกสิ่งต่อไปนี้ในวงวนไม่สิ้นสุด:

  1. ความสำเร็จ
  2. มีข้อมูลเป็นจริง ‹- ค่าบูลีนของจริง
  3. การทดสอบ
  4. จริง ‹--ค่าบูลีนของจริง
  5. เท็จ ‹- ค่าบูลีนของเท็จ

ฉันสงสัยว่าการพิมพ์เท็จในตอนท้ายจะไม่ส่งคืนเท็จ มันไม่ส่งคืนอะไรเลย

เมื่อฉันเปลี่ยน ng-show เป็น ng-init เช่นนี้:

<div ng-init="isRegistered()"></div>

ฉันได้ผลลัพธ์ โดยไม่ต้อง วนซ้ำไม่สิ้นสุด:

  1. เท็จ
  2. ความสำเร็จ
  3. ได้ข้อมูลบางอย่างที่เป็นจริง
  4. การทดสอบ
  5. จริง

ดังนั้นด้วย ng-init ดูเหมือนว่ามันจะคืนค่า $scope.test global เป็นจริง - ด้วยเหตุนี้จึงยุติลง ด้วย ng-show เนื่องจากลักษณะของการเรียก async gapi และอาจเป็นเพียงลักษณะของ ng-show แม้ว่าฉันจะขอค่าตอบแทน แต่ก็ไม่เคยส่งคืนอะไรเลย ฉันไม่รู้ว่าทำไม.

อย่างไรก็ตาม ฉันสับสนเนื่องจากเนื้อหาของฟังก์ชัน joe() - การเรียก async gapi - ดูเหมือนจะถูกเรียกแบบอะซิงโครนัสได้สำเร็จ แต่เนื้อฟังก์ชัน isRegistered() ไม่เคย "รู้" ว่ามันเสร็จแล้ว - ดังนั้นการวนซ้ำนี้

ฉันจะให้ isRegistered()/ng-show ทราบได้อย่างไรว่าการโทร async gapi เสร็จสิ้นแล้วส่งคืนจริงหรือเท็จ และจะไม่อยู่ในสถานะวนซ้ำไม่รู้จบตลอดเวลา สำหรับฉันแล้ว ดูเหมือนว่าจากวิธีที่ฉันเขียนโค้ด มันไม่เคยส่งคืนอะไรเลย ฉันจะทำให้ isRegistered() ส่งคืนจริงหรือเท็จได้อย่างไรตามการส่งคืนของการเรียก async gapi


person vama89    schedule 12.08.2015    source แหล่งที่มา
comment
สิ่งที่คุณกำลังทำอยู่นั้นไร้เหตุผล เมื่อสิ่งที่คุณต้องทำคือตั้งค่าตัวแปรขอบเขตแล้วส่งต่อไปที่ ng-show จำเป็นต้องอ่านเพิ่มเติมว่าวงจรการย่อยเชิงมุมทำงานอย่างไร ng-show คาดหวังนิพจน์แบบซิงโครนัส ไม่ใช่สัญญา และสัญญานั้นแตกต่างกัน แต่ละการแยกย่อยทำให้เกิดการย่อยมากขึ้น .. ergo วนซ้ำไม่สิ้นสุด   -  person charlietfl    schedule 12.08.2015
comment
หมดสติเพียงเพราะฉันติดอยู่กับการพยายามเริ่มต้นหน้านี้ผ่านการโทรแบบอะซิงโครนัส วิธีเดียวที่ฉันสามารถทำได้คือใช้ ng-init และวิธีการนั้นใช้ไม่ได้ผลเมื่อฉันรีเฟรชหน้า ดังนั้นฉันจึงลองวิธีแฮ็กนี้ด้วย ng-show แต่ตอนนี้ฉันรู้แล้วว่าคาดหวังเพียงนิพจน์ซิงโครนัสจาก สิ่งที่คุณเพิ่งแสดงความคิดเห็น ขอขอบคุณสำหรับระยะย่อยวงจรนี้ ฉันจะเก็บมันไว้ในใจเมื่อทำการดีบั๊กสิ่งนี้   -  person vama89    schedule 12.08.2015
comment
ฉันคิดว่าคำตอบที่ดีกว่าคือใน stackoverflow.com/questions/20913569/   -  person shereifhawary    schedule 30.05.2016