控制器范围中的私有变量

时间:2013-08-18 19:41:49

标签: javascript angularjs

在角度中,按照演示,我可以将控制器定义为:

function TodoCtrl($scope) {
    $scope.todos = [
                    {text:'learn angular', done:true},
                    {text:'build an angular app', done:false},
                    {text:'empty dishwasher', done:false}];

    $scope.oldtodos = [];
    var oldtodos2 = [];
    ...

你会注意到我有两个oldtodos。一个在$ scope上,一个在本地var上。如果你想要封装这个变量,我认为后一种方法是可行的 - 即除了控制器之外没有人对它感兴趣,如果你想将变量传递回模型,前者是好的

我说错了吗?

2 个答案:

答案 0 :(得分:1)

看起来你只想保留oldTodos的私人副本,如果你必须要么回复它们或者复活它们中的一个或者某个东西。在这种情况下,将oldTodos放入范围可能是有道理的。正如Maxim所说,如果要将值绑定到视图,则范围是相关的。如果您只想保存oldTodos以便保留对它们的引用,那么正常变量就可以了。

然后,如果你想把它们中的一个带回来,只需将它复制到$ scope.todos中,然后再将它复制。

请注意,您还可以将所有待办事项抽象为服务,并将服务注入您的控制器,以实现另一级别的封装和更好的测试策略。如果有必要,它还可以让您在控制器之间共享待办事项。

答案 1 :(得分:1)

简而言之,如果您希望AngularJS应用程序与应用程序范围交互,那么您需要在范围中添加数据。而已。

$scope.oldtodos是向范围添加数据的正确方法,可以在HTML模板中通过名称oldtodos引用。虽然var oldtodos2在您的控制器中是私有的,但是角度将无法访问模板中的此数据,因为它不在范围内。