严格$范围,以防止属性丛林

时间:2014-05-21 07:59:12

标签: angularjs angularjs-scope

我发现在使用angular创建应用程序时$scope开始感到混乱,因为它添加了很多,并且实际上没有办法限制分配给它的属性和方法范围。在我看来,保持清洁和可监督变得非常困难。

我创建了一个包装$scope对象的模块,该对象然后需要2个对象来预定义作用域上允许的属性和方法,如下所示(请注意,确切的代码不是问题) :

// set which scope properties are valid. currently returns $scope
// I was not able to properly extend $scope with new getter/setters
// note that this contains the FULL overview of valid properties on scope.
$scope = enforcer.init(
    $scope,
    { "foo": null, "bar": null /* object with valid properties */ }, 
    { "doFoo": null, "doBar": null /* object with valid methods */}
);

// set the actual property on the scope, could be anywhere in the controller
enforcer.set('foo', 'baz');
enforcer.set('doFoo', function () { /* ... */ });

// try to set an invalid property on the scope -> error
enforcer.set('biggle', 'boggle');

但是,由于我没有覆盖本机getter / setter,这意味着我必须调用像enforcer.set()之类的东西来向范围添加变量。这将依次匹配预定义属性,以查看是否实际预定义了所需属性,如果不是,则会抛出错误。不幸的是,这也打破了我在编辑器中的自动完成。除此之外,HTML中的范围引用也不会被检查,并且可能非常疯狂。我可以bind对任何事情进行处理,并且几小时内找不到绑定变量中的拼写错误。

我无法找到重新定义范围的getter / setter的正确方法,即使我这样做,我也无法确定当角度更新原始$scope对象时这不会中断。 / p>

您对保持范围严格和清洁有何建议?我希望范围与javascript中的任何变量一样,需要声明(即var foo;才允许使用它。

1 个答案:

答案 0 :(得分:0)

范围应仅用作将服务,工厂和资源连接在一起的布线工具。因此,经验法则是范围应该做得很少,如果你觉得你的范围被太多变量弄得乱七八糟,那就意味着你应该开始考虑重构你的代码。

阅读本文第3点:AngularJS antipatterns and pitfalls