如果您使用原型继承,则需要小心,因为在父控制器和子控制器中使用相同的变量名时很容易出错。这可以通过确保 $scope 变量在某处始终“有一个点”来避免,但需要纪律以确保您始终这样做。您还可以使用该结构访问在 RootCtrl 中设置的 NavCtrl 中的变量$scope.$parent.$parent
,但这很脆弱,并且本质上将您的控制器与 DOM 结构联系在一起,这是导致问题的根源。
$emit/$on 如果您在事件名称中打错字,则可能会出现静默失败的问题,并且在发生错误时很难跟踪正在发生的事情。最好有节制地使用它们。http://eburley.github.io/2013/01/31/angularjs-watch-pub-sub-best-practices.html说只使用它们“当您需要让多个订阅者知道一个事件并且这些订阅者需要做的不仅仅是向他们的观点传播信息。”
在控制器之间共享数据模型的常规 Angular 方法是创建一个服务,然后将其注入到两个控制器中。这也符合 OOP 的“优先组合胜于继承”原则。
app.service('dayService', function () {
var day = 'Monday';
return {
getDay: function() {
return day;
},
setDay: function(thisDay) {
day = thisDay;
}
};
})
function NavCtrl($scope, dayService) {
$scope.day = dayService.getDay();
}
function RootCtrl($scope, dayService) {
dayService.setDay('Sunday');
}
HTML:
<nav ng-controller="NavCtrl">
Today is {{day}}
</nav>
您可能还会发现 Misko关于 Angular 最佳实践的视频很有趣,它在 28 分钟左右讨论了在控制器和服务中放置的内容,以及更多关于事件($emit/$on)的内容。他的结论(意译)是事件有些问题,最好仅用于两件事确实不需要相互了解并且必须保持非常分开的情况,或者如果事件并不总是必要的,有时可以忽略。
我想说的基本规则是: