2013-12-11 61 views
2

我試圖生成嵌入編輯器(表單)的指令。外部控制器可以很容易地將「要編輯的東西」推入內部指令,但我希望外部控制器知道表單何時髒。我總體的模板(簡體):訪問指令模板中的表單狀態的「角度」方法是什麼?

<div ng-controller="outer"> 
    <account-editor account-id="currentID" dirty-flag="isDirty"></account-editor> 
</div> 

我想這個指令「外」控制器上進行更新isDirty標誌:

directive('accountEditor',[ 'account', function(account) { 
    return { 
    restrict: 'E', 
    scope: { 
     accountId: '=', 
     dirtyFlag: '=' 
    }, 
    link: function($scope, element, attr, ctrl) { 
     $scope.$watch('accountId', function() { 
     $scope.accountToEdit = account.getAccount($scope.accountId); 
     }); 
     // I WANT TO WATCH THE FORM STATE, AND UPDATE dirtyFlag 
    }, 
    template: '<form><input ng-model="accountToEdit.name"/></form>' 
    }; 
}]); 

我應該寫一個額外的指令,穿上<形式>,使用事件,在鏈接期間直接訪問DOM,還是其他?

我的完整代碼是http://jsbin.com/amuduro/1/edit,但它包含更多的功能。

+0

玩這個有點。這是一個非常重要的概念。不要在範圍中使用**原語**來傳遞子範圍。傳遞對象,所以原始對象的引用可以通過所有的後代作用域來使用....'$ scope.model = {idx:0,isDirty:false}'...將'model'傳遞到指令作用域,然後'model.isDirty = true'從子範圍將註冊參考對象上樹 – charlietfl

+0

你能解釋爲什麼這個聲明:「不要在範圍中使用原語向下傳遞子範圍。」我已經閱讀過,但我不清楚爲什麼這是一個問題。 – Darryl

+0

ok ....'var a = {},b = a' ...'b'不是'a'的副本,它是一個參考。任何改變都會影響另一個(它們是同一個對象)'var x =「foo」,y = x' ......原語'y'是'x'的副本,改變不會影響另一個。因此,當您在嵌套範圍內深入層層時...更新5層深對象將更新所有引用備份樹(同一對象)。更新原語是在兒童範圍內的死衚衕 – charlietfl

回答

0

上把一個表格名稱嵌入用於將導致被放置在指令的範圍(即使它是孤立的)控制器,所以下面的工作:

<form name='theForm'>...</form> 

,然後內指令鏈接:

$scope.$watch('theForm.$dirty', function() { 
    $scope.dirtyFlag = $scope.theForm.$dirty; 
    });