【问题标题】:how should I implement an angular select directive?我应该如何实现角度选择指令?
【发布时间】:2014-01-24 00:26:23
【问题描述】:

我正在尝试使用 angular 指令实现我自己的选择元素,并面临两难境地,在哪里构建传递给选择指令的对象,该指令将为选择构建标记。

正如角度文档中描述的控制器,它说控制器应该与其中的 UI 代码无关,所以它让我在 html 模板中编写对象:

<div ng-controller="ctrl">
    <my-select items="[{name:'name1', value:'value1'},...,{name:'name(n)', value:'value(n)}]></my-select>
</div>

但是看看结果,感觉还是把它写在 controller.js 文件中要好得多:

function ctrl($scope){
    $scope.selectItems=[{name:'name1', value:'value1'},...,{name:'name(n)', value:'value(n)}];
}

并在标记中编写如下内容:

<my-select items="selectItems"...></my-select>

什么是“Angular Way”而不是这样做?

谢谢,

伊兰

【问题讨论】:

  • “正如角度文档中描述的控制器,它说指令应该与 UI 代码无关”。这是错误的。控制器应该与 UI 代码无关,但指令应该与 UI 代码有关。
  • @jonas 感谢您的更正,你说得对,我的意思是控制器,但写了指令,修复了它。
  • @IlanFrumer 我认为指令实际上是 Angular 中最难测试的结构?
  • 我不会以这种态度在生产中使用您的指令。它们难以测试的唯一原因是它们进行 dom 操作并使用 jquery 插件扩展。

标签: javascript angularjs select angularjs-directive


【解决方案1】:

也许在视图(模板)内?

大多数选择选项是模型的一部分,而不是视图的一部分,因此它们应该通过控制器传递。 唯一的例外是非动态的 UI 特定数据,出于实际原因可以硬编码到模板中。

但即便如此,模板也不应该被巨大的数据对象弄得乱七八糟,这是不值得的。

可能在指令中?

指令应该被实现为可重用和可测试的组件,因此将特定于应用程序的数据放入其中是一个大错误。

快速原型设计?

对于快速原型制作和非常小的对象,您可能可以采用多种方式。

结论

如果您有 1000 个选项,您还会考虑在视图或指令中硬编码它们吗?

使用控制器。无论如何,您的大部分真实应用程序数据可能都应该保存在真实服务器上。

【讨论】:

  • 感谢@ilan,我相信如果我有 1000 个选项,它会来自服务。在代码示例中,我不是在指令控制器中设置 selectItems 对象,而是在包含指令的父控制器中设置,就像它写在保存/定义指令的视图上的标记中一样
  • 指令控制器与指令相同。它应该是可重用组件的一部分。控制器(带有 ng-contoller 或 ngRoute: 控制器的控制器)是要走的路。
  • 您始终可以将这些对象创建为服务(service/factory/value/provider)并将它们放在范围内。
  • 如果您不知道,您可以使用范围隔离从指令内部执行有效的数据绑定。 plnkr.co/edit/T7Exv2MvRkdVglPNksvY?p=preview
猜你喜欢
  • 2015-04-23
  • 2021-02-25
  • 1970-01-01
  • 1970-01-01
  • 2014-04-01
  • 2020-03-24
  • 1970-01-01
  • 2018-03-07
  • 2016-10-17
相关资源
最近更新 更多