25

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

谢谢

4

2 回答 2

48

“你的模型中应该总是有一个点”是指ngModel. 该指令执行双向绑定。如果你双向绑定到一个原语(例如你的情况下的布尔值),setter 会将它设置在当前范围而不是定义它的范围上,当你有一个大用户时,这可能会导致头痛 -与许多子范围的接口。它没有引用其他指令,例如ngDisable. 有关此特定问题的更多详细信息,请参阅此说明

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

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

于 2013-08-08T14:20:34.593 回答
0

这是需要点的情况。

当您有一个$scope想要用作 ngModel 值的值(我们称之为 ngModel 值selectedItem)时,您可能很想创建$scope.selectedItem并将其传递给模板。但是,如果模板创建了子范围,这是很危险的

某些 AngularJS 指令会创建子作用域:

  • ngRepeat
  • ngIf
  • ngController
  • ...和其他人(他们的文档页面将在“使用”标题下显示“此指令创建新范围”)。

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

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

作为子作用域,$child对象原型继承$parent. 这是一个 javascript 术语,基本上意味着您可以通过获取. 但是你不能设置值,这就是问题所在。这就是javascript的工作方式。$parent$child.<property>

所以一个模板可以通过阅读来访问 。但是如果模板设置,它设置它不,所以现在你有两个版本:$parent.selectedItem$child.selectedItem $child.selectedItem$child$parentselectedItem

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

ngModel指令既可以获取也可以设置范围值。获取工作,但设置破坏了事情(ss其他人已经解释)。

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

当您selectedItem在父范围上存储带有点的值时(例如,$scope.vm.selectedItem子范围模板只会获取vm对象。

使用vm,关系如下所示:

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

$child作用域只读取对象;vm它从不写入vm对象(在 JS 中,对象是引用而不是值)。而原型继承只涉及访问vm. 作用域获取vm对象后,可以直接使用其值而无需任何原型继承。

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

于 2021-11-11T19:09:07.250 回答