如果您没有在AngularJS模型中使用.(点),那么您做错了吗?

Mar*_*tin 24 angularjs angularjs-scope

我记得在AngularJS的一个视频中看到这句名言应该总是使用一个.(点)您的模型.

好吧,我想跟着这个说我有

   var item = {}
   item.title = "Easy Access to support";
   item.available = true;
   item.price = 31.67;
Run Code Online (Sandbox Code Playgroud)

所以这在我看来很有效

  {{ item.title }}
  {{ item.available }}
Run Code Online (Sandbox Code Playgroud)

我正在使用一个点,所以我觉得这很好.

但我有一些属性,我不认为是模型的一部分,但也许我错了.例如,我有一个属性,我用来启用或禁用使用ng-disable的按钮,我已使用点格式输入.它基本上就是这样进入的

 $scope.disableButton = true;
Run Code Online (Sandbox Code Playgroud)

我喜欢它

 ng-disable="disableButton"......
Run Code Online (Sandbox Code Playgroud)

我应该将模型的这一部分作为"项目"吗?或者创建另一个js对象,这样我就可以使用点来保存这个属性?

任何人都知道这是否可以接受,或者我应该用.dot做所有事情(即使是这些简单的属性)?

谢谢

Ste*_*ers 46

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

示例场景:父作用域使用$scope.foo = "bar",子作用域使用<input type="text" data-ng-model="foo">.它bar最初会显示,但是一旦用户更改了值,foo将在子范围上创建a ,绑定将读取和写入该值.父母的foo遗嘱将继续存在bar.希望能够很好地总结它.

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

  • 这是由于如何在JavaScript中访问对象属性.简单地说,在JavaScript中,`$ scope.foo ="bar"`表示"将对象$ scope的属性foo设置为值"bar"."$ scope.foo.bar ="baz"`,但是,意思是"设置属性"对象foo对象的范围$ scope到"baz".这里的重要区别在于第一个例子,`foo`是要设置的属性,在第二个例子中,`foo`是要获取的对象.设置永远不会上升到原型链,如果没有找到,可以上升到原型链.同样的事情适用于`ngModel`,其值为`foo` vs.`foo.bar`.希望这可以帮助. (6认同)
  • 'controllerAs'语法非常适用于此目的(通常是为了避免范围混淆). (2认同)