2013-09-06 54 views
11

Tôi đang sử dụng ng-show với cụm từ giải quyết lời hứa giải quyết thành boolean. Khi tôi làm điều này, tôi nhận được 10 lần lặp lại thông báo.angularjs ng-show với biểu hiện lời hứa

Xem http://plnkr.co/edit/XibYM0kCnXhKjNUeTsp3?p=preview

<body ng-controller="MainCtrl"> 
    <p ng-show="returnsABoolean()">non promise</p> 
    <p ng-show="returnsAPromiseThatResolvesToABoolean()">promise</p> 
    </body> 

Ctrl:

$scope.returnsABoolean =()-> 
    true 

    $scope.returnsAPromiseThatResolvesToABoolean =()-> 
    $q.when(false) 

Tôi biết rằng {{somePromise}} sẽ giải quyết, nhưng {{returnsAPromiseThatResolvesToABoolean()}} dường như gây ra vấn đề tương tự.

Bất kỳ ý tưởng nào? Tôi mong đợi này để làm việc ..

Trả lời

4

Plunker: http://plnkr.co/edit/NvjP5qHafhyIWXXotBej?p=preview

này hoạt động như tôi nghĩ rằng bạn dự định nó. $q.when() trả về đối tượng lời hứa, vì vậy ng-show không nhận được giá trị boolean; nó nhận được một đối tượng hứa hẹn.

mẫu Cập nhật:

<body ng-controller="MainCtrl"> 
    <p ng-show="returnsABoolean()">non promise</p> 
    <p ng-show="returnsAPromiseThatResolvesToABoolean">promise</p> 
    </body> 

Cập nhật Ctrl:

$scope.returnsABoolean =()-> 
    true 

    promise = $q.when(false) 
    promise.then((val) -> 
    $scope.returnsAPromiseThatResolvesToABoolean = val) 
+0

Bạn có thể cung cấp Plunkr bằng JavaScript không? –

+0

Ít hơn "trả vềTăng suấtThatResolvesToABoolean" và hơn thế nữa "willAtSomePointBeABooleanPropertySetToTheResolvedValueOfAPromiseInAThenCallback" ngay bây giờ. – morewry

2

Nếu bạn kiểm tra nguồn here bạn sẽ thấy rằng các lời hứa đã được giải quyết trong nextTick, vì vậy $scope chỉ thay đổi tiếp theo góc thời gian tạo chu kỳ $digest. Nhưng chức năng của bạn trả về một lời hứa mới trên mỗi chu kỳ $digest, không bao giờ thực sự nhận được giá trị được giải quyết của lời hứa trước đó.

Đó cũng là một vấn đề cũ đã được thảo luận here.

Bạn có thể khắc phục sự cố này bằng cách giữ tham chiếu "liên tục" với lời hứa của mình bên ngoài chức năng như tôi đã làm here.

8

AngularJS giải quyết lời hứa tự động ràng buộc mẫu. Tuy nhiên, bạn nên sử dụng lời hứa trong ng-init để ngăn chu kỳ tiêu hóa trả lại lời hứa mới mỗi lần đánh dấu.

<p ng-init="v=returnsAPromiseThatResolvesToABoolean()" ng-show="v">promise</p> 
+1

Theo tài liệu Angular 1.3, đây sẽ không phải là cách sử dụng thích hợp của ng-init: 'Cách sử dụng ngInit thích hợp duy nhất là để đánh dấu các thuộc tính đặc biệt của ngRepeat, như đã thấy trong bản demo bên dưới. Bên cạnh trường hợp này, bạn nên sử dụng bộ điều khiển thay vì ngInit để khởi tạo giá trị trên một phạm vi'', https://docs.angularjs.org/api/ng/directive/ngInit – splodingsocks

Các vấn đề liên quan