在范围内拥有多个控制器是不错的做法,这样您就可以在整个文档中的每个控制器之间来回切换?
例如,如果我想交错两组价格/数量/总价值,那么执行以下操作是不好的设计:On Plnkr
<html ng-app="invoiceTest">
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.12/angular.min.js"></script>
<script type="text/javascript" src="invoiceTest.js"></script>
</head>
<body>
<span ng-controller="InvoiceController as invoice1">
<span ng-controller="InvoiceController as invoice2">
<div>Cost 1: <input type="number" ng-model="invoice1.cost" required ></div>
<div>Cost 2: <input type="number" ng-model="invoice2.cost" required ></div>
<div>Quantity 1: <input type="number" ng-model="invoice1.qty" required ></div>
<div> Quantity 2: <input type="number" ng-model="invoice2.qty" required ></div>
<div><b>Total 1: </b>{{invoice1.total('USD') | currency}}</div>
<div><b>Total 2: </b>{{invoice2.total('USD') | currency}}</div>
</span>
</span>
</body>
</html>
或者,有没有办法在范围内携带多个控件而不嵌套它们,或者将元素的范围指向先前声明的控制器实例?
感谢您的任何建议。我刚刚开始使用棱角分明。我习惯于(MVVM)框架,你绑定的元素在ViewModel中实例化,而不是在View本身。
答案 0 :(得分:0)
我要说你的用例有点人为。您的示例实际上只需要一个具有对象数组的控制器,每个控制器都有数量和价格。
我想说我无法想到两个控制器是个好主意的情况;控制器应该是非常独立的,如果你有两个控制器在同一个代码上,你就会让自己陷入冲突和麻烦。这并不是说你不应该嵌套逻辑 - 将逻辑放在指令中可能是一个好主意,而且这是控制器内部的一种控制器 - 但是将两个控制器放在一起通常意味着你想要在它们之间共享数据,这可能会很快笨拙。
让用户获取角色需要时间,但在您的示例中,我会尝试重构您的控制器以获得一个对象数组,然后使用ng-repeat
之类的指令为您生成html,而不是自己编写。 Angular在将模型转换为视图方面非常强大,一旦你使用它,我认为你会发现使用多个控制器并不是最糟糕的想法,但几乎总有一个更好的解决方案更容易编写和更容易维护。
修改强>
例如,这是您在一个控制器下的原始示例,以及显示它正常工作的完整JSFiddle。
app.controller('OneController', function($scope){
$scope.invoices = [
{ cost: 100,
qty: 5,
total: function(){return this.cost*this.qty}
},//etc.
];
});
app.directive('compareInvoices', function(){
return {
restrict: 'E',
replace: true,
scope: {
invoices: '='
},
template:'<div>'+
'<div ng-repeat="invoice in invoices">Cost {{$index+1}}: <input type="number" ng-model="invoice.cost" required ></div>'+
'<div ng-repeat="invoice in invoices">Quantity {{$index+1}}: <input type="number" ng-model="invoice.qty" required ></div>'+
'<div ng-repeat="invoice in invoices"><b>Total {{$index+1}}: </b>{{invoice.total()}}</div>'+
'</div>'
}
});
它创建了您最初的相同HTML,但也可以处理任意数量的发票,而不仅仅是2,如果您想比较两张发票,您可以在控制器内轻松完成,因为它可以立即访问