我想創建幾個指令來封裝佈局,這樣我就可以從佈局中抽象出來(這是我理解指令的主要目標之一)。阻止指令和表單
所以我想擁有的是這樣的:
<dialog>
<dialog-title></dialog-title>
<dialog-body></dialog-body>
<dialog-footer></dialog-footer>
</dialog>
我創建了3個簡單的指令,這個看起來類似這樣
app.directive('dialog',()=>{
return {
template: '<div class="dialog" ng-transclude></div>',
replace: true,
transclude: true,
restrict: 'E',
}
})
然後我想,以確保模型定義在一個指令(dialog-body)中將在另一個(dialog-footer)中可見,因爲我需要該對話框上的某種形式以及頁腳中的某些導航按鈕,可能會在不依賴於該形式有效或無效的情況下禁用該按鈕。
<body ng-controller="MainCtrl">
<p>age: {{age}}</p>
<dialog>
<p>age: {{age}}</p>
<dialog-body>
<form name="dialogForm">
<p>age: {{age}}</p>
<input ng-model="age" minlength="3"/>
</form>
</dialog-body>
<dialog-footer>
<p>age: {{age}}</p>
</dialog-footer>
</dialog>
</body>
在ng-model
將創建對話框體的範圍年齡變量,但它不會出現在其他指令,直到我把它放在對象和MainCtrl
申報。這是它如何工作的:
<body ng-controller="MainCtrl">
<p>age: {{user.age}}</p>
<dialog>
<p>age: {{user.age}}</p>
<dialog-body>
<form name="dialogForm">
<p>age: {{user.age}}</p>
<input ng-model="user.age" minlength="3"/>
</form>
</dialog-body>
<dialog-footer>
<p>age: {{user.age}}</p>
</dialog-footer>
</dialog>
</body>
和控制器:
app.controller('MainCtrl', function($scope) {
$scope.user = {age: 1}
})
現在,我想提出一個形式。那應該在對話框體的範圍上創建FormController,就像ng-model
那樣(或者這裏有一些區別?)。我需要通過dialog-footer訪問它來檢查表單的有效性。
所以在模板中創建表單後,我需要在MainCtrl的範圍中定義formController,這裏是第一個問題 - 我如何創建FormController的實例?我認爲應該$scope.dialogForm = {$valid: true}
用於測試目的工作,這是我最後的模板:
<body ng-controller="MainCtrl">
<p>age: {{user.age}}</p>
<p>validity: {{dialogForm.$valid}}</p>
<dialog>
<p>age: {{user.age}}</p>
<p>validity: {{dialogForm.$valid}}</p>
<dialog-body>
<form name="dialogForm">
<p>age: {{user.age}}</p>
<p>validity: {{dialogForm.$valid}}</p>
<input ng-model="user.age" minlength="3"/>
</form>
</dialog-body>
<dialog-footer>
<p>age: {{user.age}}</p>
<p>validity: {{dialogForm.$valid}}</p>
</dialog-footer>
</dialog>
</body>
這裏談到的主要問題。當中的表單有效性發生變化時,它並不反映在其他指令中。爲什麼?我在這裏錯過了什麼?
我的主要目標是在應用程序中爲大多數使用的組件提供指令,以便從實際佈局中抽象出 - 可以以不同的方式完成此操作嗎?
這裏是plunk