当前位置: 首页 > 面试题库 >

没有自己的模板的AngularJS隔离范围的指令

莫欣悦
2023-03-14
问题内容

我想在没有自己的模板的AngularJS中创建可重用的指令。我也想为该指令设置隔离范围。我的方法的最佳做法是什么?为什么我的示例不符合我的预期?

我希望可以分别从指令中编辑obj1和obj2。

HTML:

<div ng-controller="MyCtrl">
  X1: {{ obj1.x }}, Y1: {{ obj1.y }}
  X2: {{ obj2.x }}, Y2: {{ obj2.y }}
  <hr>
  Edit obj1: 
  <div draggable target="obj1">
    <input type="text" ng-model="target.x">
    <input type="text" ng-model="target.y">
  </div>
  Edit obj2:
  <div draggable target="obj2">
    <input type="text" ng-model="target.x">
    <input type="text" ng-model="target.y">
  </div>
</div>

JS:

angular.module("App", [])
  .controller("MyCtrl", function($scope) {
    $scope.obj1 = {
      x: 10,
      y: 20
    };
    $scope.obj2 = {
      x: 30,
      y: 40
    };
  })
  .directive("draggable", function() {
    return {
      scope: {
        target: "="
      },
      link: function(scope, el, attrs) {
        console.log("scope: ", scope);
      }
    }
  });

PLUNKR:http://plnkr.co/edit/Dw8IiFVSOZGjSTFGRMzZ


问题答案:

您的代码现在的工作方式是,每个指令的内容都绑定到父作用域,而不是指令的隔离范围,因此每个指令target都是对同一变量的引用。

您需要做的就是transclude指令的内容。通常的用法是,您希望内容位于指令的父范围内,而不在隔离范围内。但是,您希望内容在指令的隔离范围内。因此,您必须transclude手动调用该函数,并将内容绑定到指令的隔离范围:

.directive("draggable", function($compile) {
  return {
    transclude: true,
    scope: {
      target: "="
    },
    link: function(scope, element, attrs, ctrl, transclude) {
      transclude(scope, function(clone) {
       element.append(clone);
      });
    }
  }
})

您可以在此Plunker中看到这一点。它没有做的一件事是$watch‘target’的内容,因此我怀疑它不会对指令上“
target”属性的更改做出反应。这可能最好留给另一个问题。

编辑:使用transclude不正确/过于复杂。您可以将scopein作为第一个参数传递,以将克隆正确绑定到正确的作用域。



 类似资料:
  • 那么,的目的是什么?不能访问通过传递的所有属性。为什么一个max的访问值不能作为而不是 为什么要像那样分配回来? 谢了。

  • 问题内容: 请在这里查看示例 角需要,,以在所述分离的范围对象从父范围访问它来限定。 在这里使用 那么,目的是什么?无法访问通过传递的所有属性。为什么不能将max的一个访问值代替 为什么要分配回来像? 由于此应用程序是由Angular作者编写的,因此我希望有一个理由。 谢谢。 问题答案: attrs的目的是什么? 在与指令相同的元素上定义的属性有几个用途: 它们是将信息传递到使用隔离范围的指令的唯

  • 如果不使用隔离作用域,我似乎找不到从指令中调用父作用域上的函数的方法。我知道如果我使用隔离作用域,我可以使用“ 在这个简单的示例中,我想显示一个JavaScript确认对话框,并且只有在确认对话框中单击“确定”时才调用doIt()。使用隔离范围很简单。指令如下所示: 但问题是,因为我使用的是隔离作用域,所以上面示例中的ng hide不再针对父作用域执行,而是在隔离作用域中执行(因为在任何指令上使用

  • 问题内容: 我首先尝试使用AngularJS自定义指令。 我在指令的链接功能中使用(或理解…)隔离范围时遇到麻烦。 这是我应用程序这部分的代码: view.html 是在viewCtrl范围内发布的变量,其中包含请求的xml字符串。 rawData.js raw-data.html 我不明白为什么弹出模式时会显示ID正确,但是当我尝试使用它时,其值是不确定的。 也许我对隔离的范围值(和)错了。 感

  • 问题内容: 我想编写带有隔离范围的指令,但也想使该范围可用于父范围的控制器。我找到了这个解决方案: 参见柱塞。 我觉得这有点丑陋,因为它涉及用HTML编写属性,而在控制器的代码中,您无法确定范围属性的来源。有一个更好的方法吗? 编辑: 此外,似乎在运行控制器“ Main”时$ scope.popup甚至不可用。指令的链接功能尚未执行? 问题答案: 为了保持适当的关注点分离,您不应该混合作用域。更不

  • 问题内容: 我似乎找不到不使用隔离范围从指令内调用父范围内的函数的方法。我知道,如果我使用隔离作用域,则可以在隔离作用域中使用“&”来访问父作用域上的函数,但是在不必要时使用隔离作用域会产生后果。考虑以下HTML: 在这个简单的示例中,我想显示一个JavaScript确认对话框,并且仅当他们在确认对话框中单击“确定”时才调用doIt()。使用隔离范围很简单。该指令如下所示: 但是问题是,因为我使用