gpt4 book ai didi

javascript - AngularJS - $emit/$on 或范围继承哪个更好?

转载 作者:数据小太阳 更新时间:2023-10-29 06:02:23 24 4
gpt4 key购买 nike

假设我有以下 HTML 结构:

<body ng-app="demo" ng-controller="RootCtrl">
<header>
<!-- Header Material -->
</header>

<main ng-controller="MainCtrl">
<!-- Main Content -->

<nav ng-controller="NavCtrl">
<!-- Navbar -->
</nav>
</main>
<body>

现在,假设 NavCtrl 需要操纵恰好存在于 RootCtrl 范围内的模型 - 在这种情况下 $emit/$on 更适合?在什么情况下通过范围继承直接操作模型会更好?

最佳答案

如果您使用原型(prototype)继承,则需要小心,因为在父 Controller 和子 Controller 中使用相同的变量名很容易出错。这可以通过确保 $scope 变量总是在某处“有一个点”来避免,但是需要纪律来确保你总是这样做。您还可以使用 $scope.$parent.$parent 结构访问 RootCtrl 中设置的 NavCtrl 中的变量,但这很脆弱,并且本质上将您的 Controller 绑定(bind)到 DOM 结构,这是导致问题的原因线。

$emit/$on 有一个问题,如果您在事件名称中输入错误,可能会无声地失败,并且在发生错误时很难跟踪发生的事情。最好少用它们。 http://eburley.github.io/2013/01/31/angularjs-watch-pub-sub-best-practices.html只说“当你需要让多个订阅者知道一个事件并且这些订阅者需要做的不仅仅是向他们的 View 发送信息时”使用它们。

在 Controller 之间共享数据模型的常规 Angular 方法是创建一个服务,然后将其注入(inject)到两个 Controller 中。这也符合一般 OOP 的“prefer composition over inheritance”原则。

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 的 video on Angular best practices有趣的是,它讨论了在 28 分钟左右将什么放入 Controller 与服务中,以及更多关于事件($emit/$on)的内容。他的结论(转述)是事件有点问题,最好只用于两件事确实不需要相互了解并且必须保持非常独立的情况,或者如果事件并不总是必要的,有时可以忽略。

我会说基本规则是:

  • 使用服务在两个 Controller 之间共享数据,它比继承稍微复杂一点,但并不难。

  • 使用事件以复杂的方式在多个不同的订阅者之间共享。

  • Controller 中的 $scope 应该是“只写”的(规则直接取自上面 Misko 的最佳实践视频)。 “NavCtrl 需要操纵碰巧存在于 RootCtrl 范围内的模型”的范围继承也将涉及读取父范围,因此我认为最好避免。

关于javascript - AngularJS - $emit/$on 或范围继承哪个更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18179623/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com