我记得在 AngularJS 的视频中看到过这句著名的引言,说应该始终使用 . (点)在你的模型中。
好吧,我正在尝试遵循我所说的
var item = {}
item.title = "Easy Access to support";
item.available = true;
item.price = 31.67;
所以在我看来这非常有效
{{ item.title }}
{{ item.available }}
我使用的是点,所以我认为这很好。
但是我有一些属性我不认为是模型的一部分,但也许我错了。例如,我有一个属性,用于使用 ng-disable 启用或禁用按钮,我已使用点格式输入此属性。基本上就是这样输入的
$scope.disableButton = true;
我使用它就像
ng-disable="disableButton"......
我应该将这部分作为模型的“项目”吗?或者创建另一个 js 对象,这样我就可以使用点来保存这个属性?
有人知道这是否可以接受,或者我应该用 .dot 做所有事情(即使是这些简单的属性)??
谢谢
“模型中应该始终有一个点”指的是
ngModel
。该指令进行双向绑定。如果您双向绑定到一个原语(例如您的情况中的布尔值),则设置器会将其设置在当前作用域而不是定义它的作用域上,当您有大量用户时,这可能会导致头痛 -与许多子作用域的接口。 它不涉及其他指令,例如ngDisable
。有关此特定问题的更多详细信息,请参阅此解释。
示例场景:带有
$scope.foo = "bar"
的父作用域和带有 <input type="text" data-ng-model="foo">
的子作用域。它最初会显示 bar
,但一旦用户更改值,就会在 child 作用域上创建
foo
,并且绑定将读取和写入该值。父母的 foo
将保留为 bar
。希望总结得很好。
因此,出于
ngModel
的目的,您可能必须创建一个对象来解决此类绑定问题,但对于任何其他指令,您应该具有常规的逻辑分组。
这里有一个需要点的情况。
当您想要将
$scope
值用作 ngModel 值(我们称之为 selectedItem
)时,您可能会想创建 $scope.selectedItem
并将其传递给模板。但是,如果模板创建子作用域,这很危险。
有一些 AngularJS 指令可以创建子作用域:
ngRepeat
ngIf
ngController
由于作用域继承的工作方式,子作用域是危险的。关系是这样的:
-- $parent scope
├ selectedItem
└─ $child scope
作为子作用域,
$child
对象原型继承自$parent
。这是一个 JavaScript 术语,基本上意味着您可以通过获取
$parent
来 get任何
$child.<property>
属性。但你无法set值,这就是问题所在。这就是 javascript 的工作原理。 因此模板可以通过读取
$parent.selectedItem
来访问
$child.selectedItem
。但如果模板sets
$child.selectedItem
,它会将其设置为
$child
而不是
$parent
,所以现在您有两个版本的
selectedItem
:
-- $parent scope
├ selectedItem
└─ $child scope
└ selectedItem
和 ngModel
指令get 和 set 范围值。获取有效,但设置会破坏一些东西(正如其他人所解释的)。 为什么使用点可以解决问题
selectedItem
值时(例如
$scope.vm.selectedItem
),则子作用域模板只能获取
vm
对象。使用
vm
,关系如下所示:
-- $parent scope
├ selectedItem
│ └─ vm
│ └─ selectedItem
└─ $child scope
$child
范围仅读取
vm
对象;它永远不会写入一个新的
vm
对象(在JS中,对象是引用而不是值)。而原型继承只涉及访问
vm
。作用域获取
vm
对象后,它可以直接使用其值,而无需任何原型继承。 将其视为在范围之间传递对象。