【问题标题】:Angularjs - Adding an attribute directive to a select clobbers ng-optionsAngularjs - 将属性指令添加到选择的clobbers ng-options
【发布时间】:2013-08-23 21:40:56
【问题描述】:

我正在尝试将属性指令添加到使用 ng-options 的选择中:

<select ng-model="item.Subcategory" ng-options="subcategory.Name as subcategory.Name for subcategory in GetSubcategories(item.Category)" monitor></select>

目前,它没有做任何有意义的事情:

angular.module("monitor", [])
.directive("monitor", function()
{
    var directive =
    {
        restrict: "A",
        scope:
        {
        },
        controller: function($scope)
        {
            console.log("I exist");
        }
    };

    return directive;
});

它似乎正在工作的指令,因为我看到使用该指令的每个项目都有一个“我存在”,但它选择失去了它的选项。

使用该指令后,我可以在 HTML 中将其视为选择的唯一选项:

<option value="?" selected="selected"></option>

与此相反,不使用指令时:

<option value="0" selected="selected">Cats</option>
<option value="1">Dogs</option>

为什么我的指令会破坏 ng-options?

谢谢。

【问题讨论】:

标签: select angularjs directive


【解决方案1】:

这里可能存在多个问题,其中任何一个都可能是问题的原因。

根据AngularJS Developer Guide on Directives

如果同一元素上的多个指令请求一个新范围,则只会创建一个新范围。

您正在为您的指令创建一个新的隔离范围,这可能会覆盖其他指令的范围,包括 ng-options。

另外,您应该记住,控制器参数会创建一个与其他指令共享的新控制器:

控制器构造函数。控制器在预链接阶段之前被实例化,并与其他指令共享(参见 require 属性)。这允许指令相互通信并增强彼此的行为。

除非您想使用您的指令与其他指令共享数据,否则您应该避免创建控制器。

有什么原因导致你的指令不能完成它在一个简单的链接函数中需要做的事情吗?

【讨论】:

  • 指令中的控制器不仅仅用于与其他指令共享数据。它们的功能与常规应用程序控制器几乎相同:为指令提供行为。根据定义,链接函数是应该进行 DOM 操作的地方。
猜你喜欢
  • 1970-01-01
  • 2020-06-08
  • 2017-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多