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;
  });