2012-08-14 38 views
28

Làm cách nào để chạy phương thức $scope.myWork() sau khi hiển thị mẫu? Tôi muốn thiết lập các $scope.value và sau đó tôi cần phải thay đổi một cái gì đó với JQuery (ví dụ như trong DOM của nội dung mẫu). $scope.$watch('value', function(){....}) đang hoạt động "trước khi" hiển thị (DOM của mẫu chưa có sẵn). Cảm ơn.AngularJS: gọi lại sau khi kết xuất (làm việc với DOM sau khi kết xuất)

Trả lời

20

Tạo directive chạy mã của bạn trong hàm liên kết. Chức năng liên kết được gọi sau khi mẫu được tạo.

Xem ng-click để có ý tưởng.

+0

Có ví dụ của tôi, điều đó không làm việc - http://jsfiddle.net/C6SUv/7/ (tại sao isn' t $ scope.afterRender gọi sau mỗi lần render?). – user1595465

+0

vì hàm liên kết được gọi một lần sau khi phần tử được hiển thị, không phải sau mỗi kết xuất của góc. Tại sao bạn không thể tạo ra chỉ thị làm cho những thay đổi mà bạn cần với jQuery và cập nhật góc? Thao tác với DOM bên trong các bộ điều khiển không phải là cách thực hành tốt –

+0

Hmmmmm. Tôi phải di chuyển div với chiều cao cố định. Tôi có các nút để di chuyển con trỏ trong danh sách các trường. Tôi đặt $ scope.value trong ngClick và sau đó tôi cần phải di chuyển trên vị trí bên phải (thông qua scrollTop). Đó là lý do, tại sao tôi muốn thao tác với DOM bên trong bộ điều khiển. Bất kỳ ý tưởng? – user1595465

15

tôi sử dụng terminaltransclude trong một chỉ thị thuộc tính để gọi một phương thức scoped sau một mô hình được cập nhật và xem là ra (trong trường hợp của tôi để thay đổi kích thước một iframe sau một $ Resource.query):

.directive('postRender', [ '$timeout', function($timeout) { 
var def = { 
    restrict : 'A', 
    terminal : true, 
    transclude : true, 
    link : function(scope, element, attrs) { 
     $timeout(scope.resize, 0); //Calling a scoped method 
    } 
}; 
return def; 
}]) 

Thời gian chờ $ là ma thuật đen. Nó nên có thể khai báo phương thức JS làm giá trị thuộc tính và phân tích cú pháp nó.

Vì vậy, tôi sử dụng nó trong một ng-repeat (trong trường hợp của tôi một cây được trả lại một cách đệ quy):

<div post-render ng-repeat="r in regions | orderBy:'name'" ng-include="'tree_region_renderer.html'"> 
2

Jens câu trả lời ở trên sẽ làm việc, nhưng lưu ý rằng trên AngularJS phiên bản mới hơn (ví dụ 1.2.3) bạn không thể có chỉ thị postRender đó kết hợp với ng-repeat như các thuộc tính trên cùng một thẻ vì cả hai đều có transclude: true. Trong trường hợp đó, bạn phải loại bỏ transclude hoặc có một thẻ riêng biệt với thuộc tính chỉ thị postRender.
Cũng cần lưu ý ưu tiên của các thuộc tính khi sử dụng thiết bị đầu cuối: true vì bạn có thể có thuộc tính không hiệu quả do thuộc tính được ưu tiên cao hơn trên cùng một thẻ.

7

Tôi cũng gặp phải vấn đề này, các giải pháp khác không hiệu quả đối với tôi, và dường như loại thước đo Thước đo phải được giải quyết. Một đánh giá nhanh chóng của Protractor's client-side scripts cho thấy nó sử dụng angular.getTestability(element) để biết khi nào thực sự chạy thử nghiệm. Phương thức chờ cho đến khi không có thời gian chờ hoặc yêu cầu http đang chờ xử lý và sau đó chạy cuộc gọi lại của bạn. Đây là chỉ thị của tôi:

export function afterRender ($timeout) { 
"ngInject"; 
    return { 
     restrict: 'A', 
     terminal: true, 
     link: function (scope, element, attrs) { 
     angular.getTestability(element).whenStable(function() { 
      console.log('[rendered]'); 
     }); 
     } 
    }; 
} 
+1

Vì bạn đang chạy bên trong ứng dụng Góc, bạn có thể chỉ cần tiêm '$ browser' và đăng ký gọi lại với phương thức' notifyWhenNoOutstandingRequests() '. Tuy nhiên, lưu ý rằng điều này phụ thuộc vào một số API riêng tư, không có giấy tờ và có thể bị gián đoạn mà không cần thông báo. – gkalpak

-2

Tôi tìm thấy trang này khi tìm cách tạo hồ sơ hiển thị DOM. Tôi tìm thấy một giải pháp đơn giản, rất hiệu quả trong trường hợp sử dụng của tôi.

Đính kèm trình xử lý ng-init vào phần tử DOM và trong hàm điều khiển, sử dụng $ timeout để thực hiện thực thi. Ví dụ:

HTML:

<div ng-init="foo()"> 

JS:

$scope.foo = function() { 
    $timeout(function() { 
     // This code runs after the DOM renders 
    }); 
}); 
Các vấn đề liên quan