我想知道在$scope
对象上声明函数的最佳实践是什么。如果我有一个未在HTML页面上使用的功能,应该在$scope
上声明吗?
例如:
$scope.pageModel = { variables }
$scope.pageModel.btnSearchOnClick = function() {
// some action
}
function randomFunction() {
// some more actions
}
HTML中使用btnSearchOnClick()
函数,例如:
<button name = "btnSearch" ng-click = "pageModel.btnSearchOnClick" ... >
然而,在使用此控制器的HTML中可能永远不需要randomFunction()
函数,所以可以像我上面那样声明它吗?或者控制器内的每个功能是否应附加到$scope
?
答案 0 :(得分:1)
如果你问我,你设置它的方式比在$ scope上公开所有内容更好。
我不确定对这个主题或“最佳实践”有一个普遍的共识,所以我会选择你拥有的东西。
不需要从$ scope或视图调用的函数通常可以按照您的方式进行定义。
我还想做的是,如果一个函数变得非常沉重,暴露在$ scope范围内 - 将它分成更小的,更多的点函数来执行单独的任务。
不将这些函数暴露在$ scope上的缺点是缺乏可测试性(可以说你不关心单元测试中的内部实现)。解决这个问题的方法是在Controller本身上定义它们。就这样:
app.controller('someCtrl', function ($scope) {
var ctrl = this;
$scope.exposed = function () {
ctrl.internal();
});
ctrl.internal = function () {
console.log('Internal function called from $scope');
});
});
这样,在你的单元测试中 - 你可以做这样的事情(记住这只是一个粗略的例子):
describe('someCtrl', function () {
var Subject, $scope;
beforeEach(function () {
// setup...
inject(function ($rootScope, $controller) {
$scope = $rootScope.$new();
Subject = $controller('someCtrl', {
$scope: $scope
});
});
});
context('$scope', function () {
it('has an exposed function', function () {
expect($scope).to.have.property('exposed').and.to.be.a('function');
});
});
context('internals', function () {
it('has an internal function', function () {
expect(Subject).to.have.property('internal').and.to.be.a('function');
});
});
});