2013-12-11 31 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; 
    });