应该避免在AngularJS控制器中包含常规Javascript对象吗?
我正在阅读亚当·弗里曼的《支持安古拉》一书,我对书中的一个例子提出了一个挑剔的问题:应该避免在AngularJS控制器中包含常规Javascript对象吗?,javascript,angularjs,Javascript,Angularjs,我正在阅读亚当·弗里曼的《支持安古拉》一书,我对书中的一个例子提出了一个挑剔的问题: myApp.controller("tomorrowCtrl", function($scope) { var dayNames = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday";] $scope.day = dayNames[(new Date().getDay() + 1) % 7]
myApp.controller("tomorrowCtrl", function($scope) {
var dayNames = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday";]
$scope.day = dayNames[(new Date().getDay() + 1) % 7];
});
我了解此控制器的总体用途:通过$scope.day
在视图上显示一周中某一天的名称。但是我不明白为什么控制器使用普通的Javascript数组--var dayNames
-来创建$scope
对象
说明控制器用于:
设置$scope对象的初始状态[并]向$scope对象添加行为
果然,dayNames
帮助设置$scope对象的初始状态。它还包含了一点应用程序的业务逻辑,所以我猜它在某种程度上是正确的。我担心的是,我还没有找到任何其他遵循这种设计模式的AngularJS控制器示例;我在Angular controller文档和PhoneCat教程中都没有找到任何内容
像这样在AngularJS控制器中包含普通Javascript对象有意义吗?(这被认为是无害的吗?)
若否,原因为何?有什么好的理由不在控制器中包含普通Javascript对象吗?另外,
dayNames
是否有不同的方式适合角度模式,比如指令或服务 你会在书籍和互联网上看到很多这样的例子。关键是,$scope.day
被设置为某个值,我确信它在您的视图中如何反映它
您可以使用外部纯Javascript逻辑并在angularJS中使用它,它显然不会破坏任何东西,但通常最好在服务/工厂/提供者的控制器之外完成所有范围操作/业务逻辑。为什么要反对angularJS并使用外部事物?你想坚持在angularJS的流程中
假设它在做更复杂的事情,它可能看起来更像这样:
myApp.factory("tomorrowService", function() {
// factory's can be written in many different patterns
// this is just for examples sake
return {
getDays : function () { /* return stuff */ }
}
});
myApp.controller("tomorrowCtrl", function($scope, tomorrowService) {
$scope.day = tomorrowService.getDays();
});
使用tomorrowService
中的方法执行所有业务逻辑并返回某种结果
我发现这篇文章()非常有助于更好地了解如何在angularJS项目中创建控制器和分离 你会在书籍和互联网上看到很多这样的例子。关键是,$scope.day
被设置为某个值,我确信它在您的视图中如何反映它
您可以使用外部纯Javascript逻辑并在angularJS中使用它,它显然不会破坏任何东西,但通常最好在服务/工厂/提供者的控制器之外完成所有范围操作/业务逻辑。为什么要反对angularJS并使用外部事物?你想坚持在angularJS的流程中
假设它在做更复杂的事情,它可能看起来更像这样:
myApp.factory("tomorrowService", function() {
// factory's can be written in many different patterns
// this is just for examples sake
return {
getDays : function () { /* return stuff */ }
}
});
myApp.controller("tomorrowCtrl", function($scope, tomorrowService) {
$scope.day = tomorrowService.getDays();
});
使用tomorrowService
中的方法执行所有业务逻辑并返回某种结果
我发现这篇文章()非常有助于更好地了解如何在angularJS项目中创建控制器和分离
该数据是否只属于该控制器,而不属于其他控制器
应用程序
这些数据是否直接支持视图模型的生成(与业务逻辑相反)
这是否会创建一个“胖”控制器(即,使代码难以遵循)
(我不知道清单是否全面)
如果答案是“不”,那么把它放在那里可能没问题
并非所有内容都必须在$scope上。我有时会在问题中看到这一点:
$scope.init = function(){
// do some initialization
}
$scope.init();
显然,没有理由将init
附加到作用域上,最好声明为控制器中定义的命名函数:
function init(){
}
init();
该数据是否只属于该控制器,而不属于其他控制器
应用程序
这些数据是否直接支持视图模型的生成(与业务逻辑相反)
这是否会创建一个“胖”控制器(即,使代码难以遵循)
(我不知道清单是否全面)
如果答案是“不”,那么把它放在那里可能没问题
并非所有内容都必须在$scope上。我有时会在问题中看到这一点:
$scope.init = function(){
// do some initialization
}
$scope.init();
显然,没有理由将init
附加到作用域上,最好声明为控制器中定义的命名函数:
function init(){
}
init();
我猜他们没有理由公开日名,所以他们没有把它绑定到$scope?我猜他们没有理由公开日名,所以他们没有把它绑定到$scope?而且吹毛求疵的是,它应该正确地命名为tomorrowService
-工厂只是生成服务实例的函数:)我输入得太快了。你赢了:)修复了@NewDevAnd和挑剔,它应该正确命名为tomorrowService
-工厂只是生成服务实例的函数:)我输入得太快了。你赢了:)修正了@NewDev