Angularjs 什么是「;棱角;如何访问指令模板中表单的状态?
我试图生成一个嵌入编辑器(表单)的指令。外部控制器能够很容易地将“要编辑的内容”推送到内部指令中,但我希望外部控制器知道表单何时变脏。我的总体模板(简化):Angularjs 什么是「;棱角;如何访问指令模板中表单的状态?,angularjs,angularjs-directive,Angularjs,Angularjs Directive,我试图生成一个嵌入编辑器(表单)的指令。外部控制器能够很容易地将“要编辑的内容”推送到内部指令中,但我希望外部控制器知道表单何时变脏。我的总体模板(简化): ,但它包含更多功能。在嵌入式for上放置表单名称将导致控制器被放置在指令的作用域中(即使它是隔离的),因此以下操作有效: <form name='theForm'>...</form> 玩一下这个。这里有一个非常重要的概念。不要在作用域中使用原语传递子作用域。传递对象,这样原始对象的引用就可以通过所有的子作用域使
,但它包含更多功能。在嵌入式for上放置表单名称将导致控制器被放置在指令的作用域中(即使它是隔离的),因此以下操作有效:
<form name='theForm'>...</form>
玩一下这个。这里有一个非常重要的概念。不要在作用域中使用原语传递子作用域。传递对象,这样原始对象的引用就可以通过所有的子作用域使用….$scope.model={idx:0,isDirty:false}
…将model
传递到指令作用域,然后model.isDirty=true
从子作用域将引用的对象注册到树上。您可以解释为什么这样的语句:“不要在作用域中使用原语来传递子作用域。”我以前读过,但我不清楚这是一个问题。好吧……var a={},b=a
。b
不是a
的副本,它是一个引用。对其中一个的任何更改都会影响另一个(它们是同一个对象)var x=“foo,y=x
。。。。作为基本体y
是x
的副本,更改其中一个不会影响另一个。因此,当您在嵌套范围中深入到层时……更新5层深的对象将更新树上的所有引用(同一对象)。因此,更新原语在子作用域上是死胡同……任何时候都可以避免指令中的隔离作用域,这样做很好。在您的指令中看到许多作用域:{/*empty obj*/}
。可能会增加额外的不必要的麻烦
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>'
};
}]);
<form name='theForm'>...</form>
$scope.$watch('theForm.$dirty', function() {
$scope.dirtyFlag = $scope.theForm.$dirty;
});