Why an extra object is needed?
我正在检查AngularBootstrapUI,特别是服务$modal,发现了一个有趣的事情。
在他们的示例中"http://plnkr.co/edit/e5xykpqwytsljua6fxwt?"p=preview'在附加到弹出窗口的控制器中,它们已将所选项目封闭到另一个内部属性中。
1 2 3
| $scope.selected = {
item: $scope.items[0]
}; |
而不是
1
| $scope.selected = $scope.items[0]; |
事实上,它们的代码可以像预期的那样工作,而我的版本却不能。
为什么需要这样做?这里有什么javascript?
谢谢
- 我想试试看,它与你的例子中引用$scope.items[0]的$scope.selected有关,并在他们的例子中成为它自己的对象,其中有一个值。虽然我不是100%,所以我希望你能得到比这更好的答案。
- 因为原型继承。看看AngularJS中作用域原型/原型继承的细微差别是什么?.
- 看看这篇文章。
- 我能理解这一点,我不明白的是,为什么当一个常规的控制器没有连接到一个模态窗口时,我的版本也能像预期的那样工作。
- 几个月前我在这里回答了一个类似的问题:stackoverflow.com/questions/18991998/…
- 这是由于scope继承的内部工作——它基本上与reference types一起工作,但在primitive types的情况下(数字、字符串、布尔值)可能有点问题。请看:http://plnkr.co/edit/7k7rncrlhfgjngviq1bt?p=preview-i将字符串(原语)更改为包含字符串的数组(数组是引用类型/复杂对象),它的工作方式是:$scope.selected = $scope.items[0]。
他们嵌套属性是因为他们想在模式中这样做:
1 2 3 4
| <li ng-repeat="item in items">
{{ item }}
</li> |
ng-repeat为每个
创建一个子作用域(模式也是创建一个子作用域);如果您有$scope.selected = $scope.items[0];的话,从ng click设置selected将在子作用域中设置属性,而不是父作用域(在该示例中是您想要的)。也可以在这里看到我的答案。在情况下
1 2 3
| $scope.selected = {
item: $scope.items[0]
}; |
更改将影响父作用域的selected对象。
- 基本上,如果我做的对,任何时候你用代码创建一个控制器,或者你有一个模式对话框,最好把控制器的所有属性都包含到一个新的对象中,比如$scope.scope=这里我们把所有新的属性放在这里这样我们就避免了任何冲突和原型继承。
- 这取决于-如果要将作用域中的对象与子作用域共享,则需要将其嵌套在某个对象中;然后可以从父作用域中设置继承对象的属性;如果不嵌套该对象并分配新值,则它只会覆盖子作用域中的现有对象,而不是修改父对象。如果您不需要通过继承与子作用域共享数据,则不需要人为地将其嵌套。
这以前一直困扰着我,所以我决定四处挖掘。
这似乎与原语和范围继承有关。将属性存储在对象中可以确保它们不会在ngrepeat等指令中被覆盖。
更多信息请访问:https://github.com/angular/angular.js/wiki/understanding-scopes
另外值得注意的是,在执行ng click="selecteditem=item"操作时,ng click="selectitem(item)"将无法工作,而没有容器对象。