2014-01-16 29 views
1

在我的應用程序中,我有許多指令可以使用它們的controllerlink函數來修改作用域對象上的各種屬性。當用戶使用該應用程序時,該對象的屬性將會改變。我想在做任何用戶更改之前先創建對象的深層副本,以便我可以恢復其原始狀態。爲此,在所有函數運行後發生事件會很有用 - 也就是說,當Angular完成自舉時。自舉完成後執行一個函數(在所有指令鏈接函數運行後)

我的第一個想法是創建一個運行函數的自定義指令,並將其添加爲控制器中的最後一個元素。但是,Angular似乎以廣度優先的方式指示,所以我的「最終」指令是第一個被鏈接的指令。

有沒有辦法做我想要的?

+0

http://stackoverflow.com/questions/20241360/angular-js-getting-the-element-from-inside-evalasync-in-directive – iamwhitebox

+0

@ whiteb0x文檔說* $ evalAsync不保證何時表達式將被執行* – AlexFoxGill

+0

嘗試了上述 - 仍然運行在其他指令 – AlexFoxGill

回答

1

它的價值:在1.2版本中引入了一個未公開的$$postDigest函數。它允許您添加在摘要循環後執行的函數。該功能只執行一次。

所以你可以做這樣的事情

module.controller('myController', function($scope) { 
    $scope.$$postDigest(function() { 
    var copyOfScope = angular.copy($scope); 
    //... 
    }); 

但要注意的是,不管你是什麼,也不會立即有什麼事情發生異步工作。這可能是通過HTTP加載值或模板或者使用超時執行一些函數。所以它可能不可能實現你想要的。

+0

非常感謝您的支持,但最終我選擇了不同的路線(但對於無證件功能仍然+1)! – AlexFoxGill

0

我放棄了試圖找到後鏈接掛鉤,而是試圖以不同的方式思考問題。

目標是讓指令通知一個對象,該對象用作查找各種模型屬性的「默認」值。因此,例如,像這樣:

<my-directive ng-model="foo" default-value="bar"></my-directive> 

本來我的指令看起來是這樣的:

.directive("myDirective", function() { 
    return { 
     scope: { ngModel: '=', defaultValue: '@' }, 
     link: function(scope, elem, attrs) { 
      $scope.ngModel = $scope.defaultValue; 
      // ...etc... 
     } 
    } 
}) 

我意識到,這可以在過程中完成,只要編譯步爲默認值間沒有」 t綁定。我看中了該解決方案看起來是這樣的:

.service("defaultValues", function(someOtherDependency) { 
    this.aDefault = someOtherDependency.getDefault(); 
}) 
.directive("myDirective", function(defaultValues) { 
    return { 
     scope: { ngModel: '=' }, 
     compile: function(elem, attrs) { 
      defaultValues[attrs.ngModel] = attrs.defaultValue; 
     } 
     // ...etc... 
    } 
}) 
.controller("theController", function($scope, defaultValues) { 
    $scope.values = angular.copy(defaultValues); 
}) 

這裏的區別是,我注射服務(單體)到我的指令,並在編譯時就可以設置一個值。這發生在控制器函數被調用之前,所以單例完全按照它的時間填充。

我希望這可以幫助別人!

相關問題