如果你在 AngularJS 模型中没有使用 .(点),你就做错了?

问题描述 投票:0回答:2

我记得在 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 做所有事情(即使是这些简单的属性)??

谢谢

angularjs angularjs-scope
2个回答
49
投票

“模型中应该始终有一个点”指的是

ngModel
。该指令进行双向绑定。如果您双向绑定到一个原语(例如您的情况中的布尔值),则设置器会将其设置在当前作用域而不是定义它的作用域上,当您有大量用户时,这可能会导致头痛 -与许多子作用域的接口。 它不涉及其他指令,例如
ngDisable
有关此特定问题的更多详细信息,请参阅此解释

示例场景:带有

$scope.foo = "bar"
的父作用域和带有
<input type="text" data-ng-model="foo">
的子作用域。它最初会显示
bar
,但一旦用户更改值,就会在
child 作用域
上创建 foo,并且绑定将读取和写入该值。父母的
foo
将保留为
bar
。希望总结得很好。

因此,出于

ngModel
的目的,您可能必须创建一个对象来解决此类绑定问题,但对于任何其他指令,您应该具有常规的逻辑分组。


1
投票

这里有一个需要点的情况。

当您想要将

$scope
值用作 ngModel 值(我们称之为
selectedItem
)时,您可能会想创建
$scope.selectedItem
并将其传递给模板。但是,如果模板创建子作用域,这很危险

有一些 AngularJS 指令可以创建子作用域:

  • ngRepeat
  • ngIf
  • ngController
  • ...以及其他人(他们的 doc 页面 会在“用法”标题下显示“此指令创建新范围”)。

由于作用域继承的工作方式,子作用域是危险的。关系是这样的:

-- $parent scope
   ├ selectedItem
   └─ $child scope

作为子作用域,

$child
对象原型继承自$parent
。这是一个 JavaScript 术语,基本上意味着您可以通过获取 
$parentget
 任何 
$child.<property>
 属性。但你无法
set值,这就是问题所在。这就是 javascript 的工作原理。

因此模板可以通过读取

$parent.selectedItem访问

 
$child.selectedItem
。但如果模板 
sets $child.selectedItem
,它会将其设置为 
$child
 而不是 
$parent
,所以现在您有两个版本的 
selectedItem
:

-- $parent scope ├ selectedItem └─ $child scope └ selectedItem

ngModel

 指令 
getset 范围值。获取有效,但设置会破坏一些东西(正如其他人所解释的)。

为什么使用点可以解决问题

当您在父作用域上存储带有点的

selectedItem

 值时(例如 
$scope.vm.selectedItem
),则子作用域模板只能
获取 vm
 对象。

使用

vm

,关系如下所示:

-- $parent scope ├ selectedItem │ └─ vm │ └─ selectedItem └─ $child scope

$child

范围仅
读取vm
对象;它永远不会
写入一个新的vm
对象(在JS中,对象是引用而不是值)。而原型继承只涉及访问
vm
。作用域获取 
vm
 对象后,它可以
直接使用其值,而无需任何原型继承。

将其视为在范围之间传递对象。

© www.soinside.com 2019 - 2024. All rights reserved.