同一角度指令的多个实例会扰乱范围变量

2024-04-02

我在页面上多次使用该指令,例如

<div data-escape-amp-curation-multi-value-selector
         data-binding-path="model"
         data-search-key="journeys"
         data-current-selection-model="model.journeys">
    </div>

<div data-escape-amp-curation-multi-value-selector
         data-binding-path="model"
         data-search-key="targets"
         data-current-selection-model="model.targets">
    </div>

我的指令看起来像

var directive : ng.IDirective = {
  restrict : 'A',
  template : '<select multiple="multiple" data-options="sources/>',
  compile() {
    return {
      pre(scope : any, element : any, attrs : any) {
        scope.readonly = attrs.readonly === 'true';
      },
      post(scope : any, element : any, attrs : any) {
        var binder = $parse(attrs.currentSelectionModel),
        valueDropDown = element.find('select.value-dropdown'),
        kendoMultiSelect = valueDropDown.data('kendoMultiSelect'),
        defer = $q.defer();

        /**
         * The method to do search.
         * @type {void}
         */
        scope.doSearch = () =  > {
          scope.showSpinner = true;
          scope.$evalAsync(() =  > {
              if (!cache) {
                metadataService.getMetadata(attrs.searchKey).then(
                  result =  > {
                    cache = result;
                    scope.sources = result;
                    defer.resolve();
                  },
                  error =  > {
                    defer.reject(error);
                  });
              } else {
                scope.sources = cache;
                defer.resolve();
              }

              defer.promise.then(() =  > {
                  kendoMultiSelect.setDataSource(scope.sources);
                  scope.showSpinner = false;
                  kendoMultiSelect.value(binder(scope));
                });
            });
        };

        kendoMultiSelect.bind('change', () =  > {
            binder.bind(scope, kendoMultiSelect.value());
          });

        /**
         * Set cache to null on location change
         */
        scope.$on(LOCATION_CHANGE_START, () =  > {
            cache = null;
          });

        scope.$watch(() =  > scope.$eval(attrs.currentSelectionModel), () =  > {
            if (!scope.sources) {
              if (angular.isDefined(cache) && cache !== null) {
                $timeout(() =  > {
                    scope.sources = cache;
                    kendoMultiSelect.setDataSource(scope.sources);
                    kendoMultiSelect.value(binder(scope));
                  });
              } else {
                scope.doSearch();
              }

            } else {
              kendoMultiSelect.setDataSource(scope.sources);
              kendoMultiSelect.value(binder(scope));
            }
          });
      }
    }
  }
}

当此代码呈现时,它会调用后端服务以根据搜索键填充源,但机器人实例的scope.sources 获得相同的值。 它获取上次搜索服务调用的值。 我在这里缺少什么? 谢谢。


scope https://docs.angularjs.org/api/ng/type/%24rootScope.Scope在 Angular 中是典型继承的,但是仅当您请求时才会创建新范围。在这种情况下,您只需装饰指令所在的父级定义的现有范围。

这意味着添加到范围的任何内容都将被同一指令覆盖。

您可以告诉您的指令创建一个新范围只需添加scope:true指令定义对象的属性:

{
  restrict : 'A',
  scope:true
  //more stuff
}

这是一个简单的例子显示创建新作用域的指令与不创建新作用域的指令之间的区别。

(function() {
  'use strict';

  function NoNewScope() {
    return {
      restrict: 'A',
      template: [
        '<div class="form-group">',
        '  <label>Name - <code>{{name}}</code></label>',
        '  <input class="form-control" type="text" ng-model="name" />',
        '</div>'
      ].join(''),
      link: function(scope) {
        scope.name = "No New Scope";
      }
    };
  }

  function NewScope() {
    return {
      restrict: 'A',
      scope: true,
      template: [
        '<div class="form-group">',
        '  <label>Name - <code>{{name}}</code></label>',
        '  <input class="form-control" type="text" ng-model="name" />',
        '</div>'
      ].join(''),
      link: function(scope) {
        scope.name = "New Scope";
      }
    };
  }

  angular.module('my-app', [])
    .directive('noNewScope', NoNewScope)
    .directive('newScope', NewScope);

}());
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>

<div ng-app="my-app" class="container">

  <div class="row">
    <div class="col-xs-6">
      <h3>NO new scope</h3>
      <div no-new-scope></div>
      <div no-new-scope></div>
    </div>
    <div class="col-xs-6">
      <h3>NEW scope</h3>
      <div new-scope></div>
      <div new-scope></div>
    </div>
  </div>

</div>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

同一角度指令的多个实例会扰乱范围变量 的相关文章

随机推荐

  • 使用 JAXB Marshaller 处理 XML 转义字符(例如引号)

    我需要使用 JAXB Marshaller JAXB 版本 2 2 将 XML java 对象序列化为 XML 文件 现在在 xml 对象中 我有一个标签 其中包含字符串值这样 lt tagA gt lt YYYYY gt done lt
  • ASP.NET Web 服务错误地返回 XML 而不是 JSON

    我正在尝试使用 jQuery 从 javascript 使用 ASMX Web 服务 当我要求 XML 时它工作得很好 但我想利用 net 的 JSON 序列化功能 这也开始让我烦恼 这不起作用 Web 服务的代码 using System
  • 像 Javascript“Math.round()”那样的 Pythonic 方式“r​​ound()”?

    我想要最 Pythonic 的方式来舍入数字 就像 Javascript 那样 通过Math round 它们实际上略有不同 但这种差异会对我的应用程序产生巨大的影响 Using round Python 3 中的方法 Returns th
  • 如何在 codeigniter 中使用 .htaccess 限制图像文件夹

    我有包含图像文件夹的 codeigniter 项目 我想让它无法通过直接 url 访问假设有人输入 url http localhost project images Pricelistupdated pdf 然后它将直接在浏览器选项卡中打
  • 课堂上的自定义事件

    我需要从类启动自定义事件 我知道用 DOM 对象和 jquery 来做到这一点 使用triggerHandler 比如 object triggerHandler inputChange param X 问题是当我在一个类中尝试这个时 如下
  • 如何以编程方式使用 ical 从重复集中删除单个事件?

    我在 10 11 日创建了一个重复事件 请参见下文 我想删除第 10 个事件 因此我使用了方法 取消 但由于 UID 相同 两条记录都将被删除 如何只删除一条记录 我应该使用任何其他值 例如 UID 吗 BEGIN VCALENDAR PR
  • XML 格式错误

    我有一个 php 脚本 用于将 xml 数据写入文件 另一个脚本将该文件的内容作为响应发送到客户端 但在客户端 我收到以下错误 XML 解析错误 格式不正确当我查看页面源时 我看到的 XML 如下
  • 制作多个文件强制下载

    抱歉 如果标题没有解释太多 让我尝试进一步解释 我的代码如下所示
  • 传单地图中奇怪的默认尺寸

    我已经拍摄了一张可用的 Leaflet 地图 但是当我添加 JQuery Mobile 标题和后退按钮时 格式变得疯狂 最初加载页面时 所有内容都加载在左上角 但是当页面在桌面上调整到最小大小或在移动设备上旋转时 一切都很好 这是打开后的样
  • 自定义类排序:没有抛出错误,Python 测试的目的是什么?

    在不指定对象的相等比较属性的情况下 Python在使用时仍然在做一些事情 gt and lt 如果您不指定 Python 实际上是通过什么来比较这些对象的 gt or lt 我预计这里会出现不受支持的操作数错误 就像在尝试将两个对象添加在一
  • 以编程方式修复 IE 中的浏览器模式

    我有一个网站完全兼容所有浏览器 包括 IE 7 至 9 当我在 IE 10 上尝试时 我感到很震惊 错误太多 而且因为我没有时间为 IE 10 修复这个问题 而且我也在使用第三方控件 Telerik 所以我决定尝试一个简单的解决方案 文档和
  • 返回具有单个元素的数组或列表时的列表或标量上下文

    我有一个函数func可以返回单个值或值列表 具体取决于函数的调用方式 因此 对于这个特定的函数 调用者会知道何时只期望一个返回值 因此希望使用更简单的语法my var func 代替my var func 问题是 在某些情况下 单个值会转换
  • 隐藏“水平”滚动条但仍然可以滚动

    我需要一些帮助来隐藏水平滚动条并仍然能够滚动 我使用过 webkit 但在 IE 和 Firefox 中不起作用 我见过很多有关垂直滚动条的帮助 但不适用于水平滚动条 有什么帮助吗 更新 我创建了一个 JSFiddle 来展示我的问题 我想
  • 如何设计一个带有可选参数的 RESTful URL 进行搜索?

    如果我必须在 RESTful Web 服务中创建一个 URL 我的客户将使用该 URL 按字段搜索所有企业 其中字段是可选的 那么该 URL 会是什么样子 可以仅通过名称 姓名和电话号码或姓名 电话号码和联系电子邮件来搜索企业 钱德鲁 将所
  • Haskell 生成预过滤排列

    有没有办法生成预过滤的排列 而不是这样做 filter condition permutations list 排列函数可以短路 例如 perms perms xs i j i lt xs j lt perms delete i xs 我尝
  • Phing 字符串操作

    我有一个 Phing 项目 您传入一个参数 我想对此参数执行简单的字符串操作 例如 strtolower 或 ucwords 等 我有什么想法可以解决这个问题吗 使用 PhpEvaLTask 怎么样
  • 如何在 Yii 中安装 AWS SDK

    我想在我的 Yii 项目中使用适用于 PHP 的 Amazon AWS SDK 但是我收到各种包含错误 例如include CFCredentials php failed to open stream No such file or di
  • 如何让 eclipse JSP 表达式语言验证接受 JSP 2.2 EL 构造?

    我有一个带有以下 JSP 标记的页面
  • 震动效果 - Flash CS6 ActionScript 3.0

    这个问题与 ActionScript 3 0 和 Flash CS6 有关 我试图让一个物体在一定时间内稍微摇晃几秒钟 我将其制作为 电影剪辑 并制作了以下代码 import flash events TimerEvent var Mach
  • 同一角度指令的多个实例会扰乱范围变量

    我在页面上多次使用该指令 例如 div div div div