Angularjs 指令中的角度范围

Angularjs 指令中的角度范围,angularjs,angularjs-directive,Angularjs,Angularjs Directive,给定JQuery UI按钮的这个相当简单的角度包装: angular.module('Sample.controllers', []) .controller('mainController', ['$scope', function($scope) { $scope.jump = function () {alert("jump");}; }]) .directive('jquiwButton', function() { return {

给定JQuery UI按钮的这个相当简单的角度包装:

angular.module('Sample.controllers', [])
  .controller('mainController', ['$scope',
    function($scope) {
      $scope.jump =  function () {alert("jump");};
   }])
  .directive('jquiwButton', function() {
    return {
      scope: {},
      restrict: 'A',
      replace:true,
      link: function(scope, element, attrs) {
        var options = {};
        if (angular.isDefined(attrs["jquiDisabled"])) {
          options.disabled = attrs["jquiDisabled"];
        }

        if (angular.isDefined(attrs["jquiIconPrimary"])) {
          if (!angular.isDefined(options.icons.primary)) {
            options.icons ={};
          }
          options.icons.primary = attrs["jquiIconPrimary"];
        }

        if (angular.isDefined(attrs["jquiIconSecondary"])) {
          if (!angular.isDefined(options.icons.secondary)) {
            options.icons ={};
          }
          options.icons.secondary = attrs["jquiIconSecondary"];
        }

        if (angular.isDefined(attrs["jquiLabel"])) {
          options.label = attrs["jquiLabel"];
        }

        if (angular.isDefined(attrs["jquiText"])) {
          options.text = attrs["jquiText"];
        }

        element.button(options);
      }
    };
  });
  angular.module('Sample', ['Sample.controllers']);  
和标记

<body ng-controller="mainController"> 
  <button jquiw-button jqui-label="Hello" ng-click="jump()">Hello</button>
</body>

你好
在我添加一个作用域之前,它工作得很好,在这一点上,我失去了使用标准角度绑定到外部作用域的能力。在我的例子中,标记'ng click='jump()'现在无法工作,因为它找不到在外部上下文中而不是在隔离范围中定义的方法jump。现在我知道我可以专门将ng click back绑定到外部作用域,但我希望避免这样做,因为它需要了解我可能需要绑定的所有可能的指令

所以我的问题是:我如何让其他指令在外部作用域中工作,同时仍然有一个孤立的作用域

普朗克:


删除第8行:
scope:{},
它会调用正确的函数。

使用
ng click=“$parent.jump()”
使用
ng click=“$parent.jump()”
您可以使用
绑定从隔离作用域内部引用父作用域中的函数。这是从指令内的隔离作用域调用函数的正确方法

我创建了一个应用程序来演示它的完美工作

以下是相关部分:

var app = angular.module('app', []);

app.controller('MainCtrl', function($scope) {
  $scope.jump = function() {
    alert('jump called');
  };
});

app.directive('myDirective', function() {
  return {
    restrict: 'E',
    scope: {
      call: '&'
    },
    link: function postLink(scope, element, attrs) {
      scope.call();
    }
  };
});
在模板中:

<section ng-app="app" ng-controller="MainCtrl">
  <my-directive call="jump()"></my-directive>
</section>


我希望这会有所帮助。

您可以使用
绑定从隔离作用域内部引用父作用域中的函数。这是从指令内的隔离作用域调用函数的正确方法

我创建了一个应用程序来演示它的完美工作

以下是相关部分:

var app = angular.module('app', []);

app.controller('MainCtrl', function($scope) {
  $scope.jump = function() {
    alert('jump called');
  };
});

app.directive('myDirective', function() {
  return {
    restrict: 'E',
    scope: {
      call: '&'
    },
    link: function postLink(scope, element, attrs) {
      scope.call();
    }
  };
});
在模板中:

<section ng-app="app" ng-controller="MainCtrl">
  <my-directive call="jump()"></my-directive>
</section>


我希望这会有帮助。

这会奏效,但似乎不合法。有没有更好的方式来表达“对于所有我没有在我的范围内定义的东西,让它在外部范围内”这样的话?它在sza中起作用。似乎使用范围不是一个很好的主意,除非您有意将其隔离。我想这是有道理的。那会管用,但似乎不合法。有没有更好的方式来表达“对于所有我没有在我的范围内定义的东西,让它在外部范围内”这样的话?它在sza中起作用。似乎使用范围不是一个很好的主意,除非您有意将其隔离。我想这是有道理的。我认为不可能做到这一点。。。。还是看看ng repeat是如何实现的……我认为不可能做到这一点。。。。我们还是来看看ng repeat是如何实现的……但这难道不需要高级知识和这些外部指令的映射吗?换句话说,我可能不知道用户将绑定ng blur或ng change,因此此方法要求我事先了解所有可能的绑定,然后手动绑定它们。如果我正确理解了您的问题,您可能会担心永远不会发生的事情。如果您正在创建一个全新的指令,那么您就是在口述其用法。如果其他开发人员在未查阅指令文档的情况下在元素上放置了
ng click
ng blur
,那么他们就是在冒险。新指令的潜在用户应该知道,您的指令使用特定属性。我想这是真的,但它仍然要求我为每个指令编写绑定代码,即使我没有做指令通常会做的事情-这很可能是一个设计功能,答案是“不要使用自己的作用域,除非您希望将指令与此类事情隔离开来。“这似乎是事实。似乎隔离范围实际上是隔离。这实际上是一个很好的问题。对于在自定义指令上传递本机
ng-*
指令而不在隔离范围内显式绑定它们,我也有同样的疑问。我发现,即使是在本地人中,他们也不总是把美好放在一起。这使我相信必须严格遵守规定的用法。这进一步让我相信,口述使用我们自己的定制指令是可以接受的。但这难道不需要对这些外部指令的高级知识和映射吗?换句话说,我可能不知道用户将绑定ng blur或ng change,因此此方法要求我事先了解所有可能的绑定,然后手动绑定它们。如果我正确理解了您的问题,您可能会担心永远不会发生的事情。如果您正在创建一个全新的指令,那么您就是在口述其用法。如果其他开发人员在未查阅指令文档的情况下在元素上放置了
ng click
ng blur
,那么他们就是在冒险。新指令的潜在用户应该知道,您的指令使用特定属性。我想这是真的,但它仍然要求我为每个指令编写绑定代码,即使我没有做指令通常会做的事情-这很可能是一个设计功能,答案是“不要使用自己的作用域,除非您希望将指令与此类事情隔离开来。“这似乎是事实。似乎隔离范围实际上是隔离。这实际上是一个很好的问题。对于在自定义指令上传递本机
ng-*
指令而不在隔离范围内显式绑定它们,我也有同样的疑问。我发现,即使是在本地人中,他们也不总是把美好放在一起。这使我相信必须严格遵守规定的用法。这进一步使我相信,口述使用我们自己的定制指令是可以接受的。