ฉันได้วินิจฉัยปัญหาในการใช้ 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;
};
มันยังคงส่งออกสิ่งต่อไปนี้ในวงวนไม่สิ้นสุด:
- ความสำเร็จ
- มีข้อมูลเป็นจริง ‹- ค่าบูลีนของจริง
- การทดสอบ
- จริง ‹--ค่าบูลีนของจริง
- เท็จ ‹- ค่าบูลีนของเท็จ
ฉันสงสัยว่าการพิมพ์เท็จในตอนท้ายจะไม่ส่งคืนเท็จ มันไม่ส่งคืนอะไรเลย
เมื่อฉันเปลี่ยน ng-show เป็น ng-init เช่นนี้:
<div ng-init="isRegistered()"></div>
ฉันได้ผลลัพธ์ โดยไม่ต้อง วนซ้ำไม่สิ้นสุด:
- เท็จ
- ความสำเร็จ
- ได้ข้อมูลบางอย่างที่เป็นจริง
- การทดสอบ
- จริง
ดังนั้นด้วย ng-init ดูเหมือนว่ามันจะคืนค่า $scope.test global เป็นจริง - ด้วยเหตุนี้จึงยุติลง ด้วย ng-show เนื่องจากลักษณะของการเรียก async gapi และอาจเป็นเพียงลักษณะของ ng-show แม้ว่าฉันจะขอค่าตอบแทน แต่ก็ไม่เคยส่งคืนอะไรเลย ฉันไม่รู้ว่าทำไม.
อย่างไรก็ตาม ฉันสับสนเนื่องจากเนื้อหาของฟังก์ชัน joe() - การเรียก async gapi - ดูเหมือนจะถูกเรียกแบบอะซิงโครนัสได้สำเร็จ แต่เนื้อฟังก์ชัน isRegistered() ไม่เคย "รู้" ว่ามันเสร็จแล้ว - ดังนั้นการวนซ้ำนี้
ฉันจะให้ isRegistered()/ng-show ทราบได้อย่างไรว่าการโทร async gapi เสร็จสิ้นแล้วส่งคืนจริงหรือเท็จ และจะไม่อยู่ในสถานะวนซ้ำไม่รู้จบตลอดเวลา สำหรับฉันแล้ว ดูเหมือนว่าจากวิธีที่ฉันเขียนโค้ด มันไม่เคยส่งคืนอะไรเลย ฉันจะทำให้ isRegistered() ส่งคืนจริงหรือเท็จได้อย่างไรตามการส่งคืนของการเรียก async gapi
ng-show
จำเป็นต้องอ่านเพิ่มเติมว่าวงจรการย่อยเชิงมุมทำงานอย่างไรng-show
คาดหวังนิพจน์แบบซิงโครนัส ไม่ใช่สัญญา และสัญญานั้นแตกต่างกัน แต่ละการแยกย่อยทำให้เกิดการย่อยมากขึ้น .. ergo วนซ้ำไม่สิ้นสุด - person charlietfl   schedule 12.08.2015