我有一个AngularJS应用程序,我认为它基本上非常典型(类似于许多示例)。
<html ng-app="myApp" ...
<body>
...
<div class="main" ng-view></div>
...
我设置了一个$routeProvider
,其中包含大量when
个来将用户定向到视图(带控制器的模板部分),例如:
$routeProvider.when('/incident/:identifier', {templateUrl:'incident.html', controller:"IncidentCtrl"});
这一切都很好。用户可以在视图之间来回切换。
现在,让我说我有一个“事件”的观点。它有一个具有“事件”属性的表单。 (您可以更改表单中的值和“保存”,这是此处的重点。)我有以下要求:
对于在现有表单下面加载的表单,我想重用现有模板partial及其后续控制器,我已经将其用于其他地方的顶级ng-view
。但是,我走了几条道路来实现这一点无济于事; ng-include
似乎不起作用,因为它非常静态,并且不允许嵌入元素的大部分生命周期。此外,似乎很难动态加载它,这意味着它将在点击“添加工单”按钮之前加载。有人能指出我可行的策略吗?显然,我的目标是促进现有模板部分和控制器的重用,而不必总是让用户在视图之间移动。非常感谢。
编辑:详细说明:我对目前为止所见过的ng-include
个想法感到不满意,因为:
$routeParams
$routeProvider
的方式相同
答案 0 :(得分:5)
我会尝试用ng-include
如果我不仅仅是一种,那么会有很多 嵌入的观点。他们都会在被展示之前被装满 没有充分的理由;矫枉过正强>
ng-if
可以在这里帮到你。在该条件成立之前,该指令不会加载DOM。当条件变为假时,它也会破坏DOM。像
<div ng-if='conditionwhenthepartialshouldbeshown'>
<ng-include src='templateName' ng-init='model=parent.someProperty'/>
</div>
我不知道如何以与我相同的方式参数化嵌入式视图 可以从$ routeProvider
传递$ routeParams
加载视图时,可以使用ng-init
传递一些参数。检查文档
我对父母和子女之间的分享太多感到不舒服
ng-init
可以再次提供帮助。您可以在子范围上创建属性,并将其传递给ng-init
我无法干净地为后续“添加”重新创建控制器
ng-if
为您做到这一点。
答案 1 :(得分:2)
我发现重现此行为的方式是使用两个控制器:一个用于“主”视图,另一个用于部分视图。
在控制器文件中
var controllers = angular.module('controllers', []);
controllers.controller('IncidentCtrl', ['$scope', function($scope) {
// Incident Ctrl Body
$scope.showForm = false;
$scope.toggleForm = function() {
$scope.showForm = !$scope.showForm;
}
}]);
controllers.controller('WorkOrderCtrl', ['$scope', function($scope) {
// Partial Form controller
// This controller can talk with $scope from IncidentCtrl
// using the $scope.$parent.$parent
$scope.save = function() {
// ...
$scope.$parent.$parent.showForm = false;
}
}]);
您的观点:
<!-- incident.html -->
<button data-ng-click="toogleForm()"> Toggle Form </button>
<div data-ng-show="showForm">
<div ng-include src="'path/to/_work_order.html'"></div>
</div>
<!-- _work_order.html -->
<div data-ng-controller="WorkOrderCtrl">
<!-- view body -->
<button data-ng-click="save()"> Save </button>
</div>