相关疑难解决方法(0)

指令隔离范围与AngularJS中的ng-repeat范围

我有一个带隔离范围的指令(这样我可以在其他地方重用该指令),当我使用这个指令时ng-repeat,它无法工作.

我已阅读有关此主题的所有文档和Stack Overflow答案,并了解问题.我相信我已经避免了所有常见的陷阱.

所以我理解我的代码因ng-repeat指令创建的范围而失败.我自己的指令创建了一个isolate-scope,并对父作用域中的对象进行双向数据绑定.我的指令将为这个绑定变量赋一个新的对象值,当我的指令没有使用时ng-repeat(父变量被正确更新),这种方法非常有效.但是,使用ng-repeat,赋值在ng-repeat作用域中创建一个新变量,而父变量看不到更改.所有这些都是基于我所读到的预期.

我还读到,当给定元素上有多个指令时,只创建一个范围.并且priority可以在每个指令中设置a 来定义指令的应用顺序; 指令按优先级排序,然后调用它们的编译函数(在http://docs.angularjs.org/guide/directive上搜索单词优先级).

所以我希望我可以使用优先级来确保我的指令首先运行并最终创建一个隔离范围,并且在ng-repeat运行时,它重新使用隔离范围而不是创建原型继承父范围的范围.该ng-repeat文档声明该指令以优先级运行1000.目前尚不清楚1是优先级更高还是优先级更低.当我1在我的指令中使用优先级时,它没有任何区别,所以我尝试了2000.但这会让事情变得更糟:我的双向绑定变成了undefined我的指令并没有显示任何东西.

我创造了一个小提示来展示我的问题.我已经priority在我的指令中注释掉了这个设置.我有一个名称对象列表和一个名为对象的指令name-row,它显示了名称对象中的名字和姓氏字段.单击显示的名称时,我希望它selected在主范围中设置变量.名称数组,selected变量name-row使用双向数据绑定传递给指令.

我知道如何通过调用主范围中的函数来使其工作.我也知道如果selected在另一个对象内部,并且我绑定到外部对象,事情就会起作用.但我现在对这些解决方案不感兴趣.

相反,我的问题是:

  • 如何防止ng-repeat从创建prototypically从父范围继承的范围,而是把它用我的指令的分离,范围有多大?
  • 为什么2000我的指令中的优先级不起作用?
  • 使用Batarang,是否可以知道正在使用哪种类型的示波器?

angularjs angularjs-directive angularjs-scope angularjs-ng-repeat

95
推荐指数
2
解决办法
5万
查看次数

指令attr内部的回调函数定义在不同的attr中

所以我有这个名为say的指令mySave,它就是这个

app.directive('mySave', function($http) {
   return function(scope, element, attrs) {
      element.bind("click", function() {
          $http.post('/save', scope.data).success(returnedData) {
              // callback defined on my utils service here

              // user defined callback here, from my-save-callback perhaps?
          }
      });
   }
});
Run Code Online (Sandbox Code Playgroud)

元素本身看起来像这样

<button my-save my-save-callback="callbackFunctionInController()">save</button>
Run Code Online (Sandbox Code Playgroud)

callbackFunctionInController现在只是

$scope.callbackFunctionInController = function() {
    alert("callback");
}
Run Code Online (Sandbox Code Playgroud)

当我console.log() attrs.mySaveCallback在my-save指令里面时,它只是给了我一个字符串callbackFunctionInController(),我在某个地方读到我应该解析它并且它会没问题,所以我试着给$parse(attrs.mySaveCallback)了我一些函数,但几乎没有我想要的那个,它让我回来了

function (a,b){return m(a,b)} 
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?这种方法从一开始就有缺陷吗?

javascript ajax angularjs angularjs-directive

38
推荐指数
3
解决办法
6万
查看次数

输入自动对焦属性

我的代码中有地方,我有这个:

<input data-ng-disabled="SOME_SCOPE_VARIABLE" />
Run Code Online (Sandbox Code Playgroud)

我也希望能够像这样使用它:

<input data-ng-autofocus="SOME_SCOPE_VARIABLE" />
Run Code Online (Sandbox Code Playgroud)

甚至更好,模仿ng-style的完成方式:

<input data-ng-attribute="{autofocus: SOME_SCOPE_VARIABLE}" />
Run Code Online (Sandbox Code Playgroud)

当前版本的AngularJS中是否存在这种情况?我注意到代码中有一个BOOLEAN_ATTR,它获取AngularJS支持的所有attr.我不想修改它,因为害怕更改版本而忘记更新.

angularjs

23
推荐指数
3
解决办法
7万
查看次数

如何在具有隔离范围的指令上使用ng-show

我有一个我这样使用的指令:

<dir model="data"></dir>
Run Code Online (Sandbox Code Playgroud)

该指令具有独立的范围.

scope :{
  model:'='
}
Run Code Online (Sandbox Code Playgroud)

现在我正在尝试使用ng-show我的页面的$ scope的另一个属性来使用该指令,如下所示:

<dir ng-show="show" model="data"></dir>
Run Code Online (Sandbox Code Playgroud)

但它不起作用,因为该指令试图show在自己的范围内找到属性.

我不希望该指令知道它的容器可能选择隐藏它的事实.

我找到的解决方法是将指令包装在一个<div>并应用于ng-show该元素,但我不喜欢这个强制我使用的额外元素:

<div ng-show="show" >
  <dir model="data"></dir>    
</div>
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法呢?

看到这个plunker:http://plnkr.co/edit/Q3MkWfl5mHssUeh3zXiR?p =preview

angularjs

23
推荐指数
2
解决办法
2万
查看次数

我可以使用具有隔离范围的ng模型吗?

我正在创建简单的ui-datetime指令.它将javascript Date对象拆分为_date,_hours和_minutes部分._date使用jquery ui datepicker,_hours和_minutes - 数字输入.

angular.module("ExperimentsModule", [])
    .directive("uiDatetime", function () {
    return {
        restrict: 'EA',
        replace: true,
        template: '<div class="ui-datetime">' +
            '<input type="text" ng-model="_date" class="date">' +
            '<input type="number" ng-model="_hours" min="0" max="23" class="hours">' +
            '<input type="number" ng-model="_minutes" min="0" max="59" class="minutes">' +
            '<br />Child datetime1: {{datetime1}}' +
            '</div>',
        require: 'ngModel',
        scope: true,
        link: function (scope, element, attrs, ngModelCtrl) {
            var elDate = element.find('input.date');

            ngModelCtrl.$render = function () {
                var date = new Date(ngModelCtrl.$viewValue);
                var fillNull = function (num) {
                    if (num …
Run Code Online (Sandbox Code Playgroud)

angularjs

22
推荐指数
2
解决办法
3万
查看次数

为什么ng-style不能与自定义指令在同一元素上工作?

我正在尝试在自定义指令标记上应用ng-style属性,有点像这样:

<my-directive ng-style="myStyle"></my-directive>
Run Code Online (Sandbox Code Playgroud)

在控制器里面我有:

$scope.myStyle = {
    "background": "red"
}
Run Code Online (Sandbox Code Playgroud)

这似乎不起作用.当我检查HTML'MyStyle'时,没有渲染.当我在常规div上应用相同的ng-style标记时,它会正确呈现.

为什么ng-style不适用于自定义指令标签?

angularjs angularjs-directive angularjs-scope

19
推荐指数
1
解决办法
7120
查看次数

AngularJS自定义指令双向绑定

如果我有一个没有模板的AngularJS指令,并且我希望它在当前作用域上设置属性,那么最好的方法是什么?

例如,一个计算按钮点击次数的指令:

<button twoway="counter">Click Me</button>
<p>Click Count: {{ counter }}</p>
Run Code Online (Sandbox Code Playgroud)

使用指令将点击计数分配给双向属性中的表达式:

.directive('twoway', [
'$parse',
  function($parse) {
    return {
      scope: false,
      link: function(scope, elem, attrs) {
        elem.on('click', function() {
          var current = scope.$eval(attrs.twoway) || 0;
          $parse(attrs.twoway).assign(scope, ++current);
          scope.$apply();
        });
      }
    };
  }
])
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?从我所读到的,一个孤立的范围将是矫枉过正,但我​​需要一个儿童范围?是否有更简洁的方法来回写指令属性中定义的范围变量而不是使用$parse.我觉得我让这个太难了.

Full Plunker 在这里.

javascript angularjs angularjs-directive

15
推荐指数
2
解决办法
6万
查看次数

如何防止在Angular指令之间共享范围?

我的所有指令都使用相同的范围,我希望我的指令可以自己操作.

指示:

app.directive('headerSort', function () {
    return {
        restrict: 'A',
        controller: function ($scope, $element, $attrs) {
            $scope.caption = $attrs.caption;

            $scope.doSort = function () {
                $scope.orderField = $attrs.headerSort;
                $scope.reverse = !$scope.reverse;
            };
        },
        template: '<div data-ng-click="doSort();">' +
                    '{{caption}}' +
                    '<i class="icon-sort"></i>' +
                  '</div>'
    };
});
Run Code Online (Sandbox Code Playgroud)

HTML:

<th data-header-Sort="FullName" data-caption="Full name"></th>
<th data-header-Sort="FirsName" data-caption="First name"></th>
<th data-header-Sort="Age" data-caption="Age"></th>
Run Code Online (Sandbox Code Playgroud)

结果是所有列都具有值'Age'并按Age排序.我当然希望每列都对它自己的列进行排序.我怎样才能做到这一点?

更新:忘了提及,orderFieldreverse用于ng-repeat | orderBy:

<tbody id="customerRows" data-ng-repeat="customer in customers | orderBy:orderField:reverse">
Run Code Online (Sandbox Code Playgroud)

angularjs angularjs-directive angularjs-scope

7
推荐指数
1
解决办法
4727
查看次数

在AngularJS中评估指令属性中的表达式

我做了很多解决方法,搜索和研究,但我无法想象如何实现我的目标.

- 问题:

  • 我有以下情况,我想避免用户可以在合同中重叠佣金日期.当用户添加新佣金时,我们会显示一个列表,其中添加了使用ngRepeat生成的佣金,这样就很难用户编辑日期.在合同部分中,这不是问题,因为要编辑合同,您必须转到其他屏幕并对其进行编辑,不能在同一视图中修改日期.

- 我感到困惑:

  • 当我编辑一个已添加的佣金时,我必须将其与之前添加的佣金进行比较,因此,我希望有一个列表,其中定义了佣金的所有日期,并且可以在指令中说明,开具一个函数的发票返回一个列表,其中包含所有日期,不包括我正在编辑的佣金日期.

- 我希望如何解决它:

  • 我想做这样的事情:

<input type="text" name="newComission_dateFrom" ng-model="newCommission.from" notincluded=myFunction({{$index}})/>

函数myFunction将迭代一个包含所有addedCommissionsDates的列表,并将它与所有日期范围进行比较,除了包含在addedCommisionsDates [index]中的范围.

目标是可以在不使用隔离范围的情况下评估属性中的表达式.

孤立的范围我遇到了很多问题,我完成了对这篇文章的同意:

在编写指令时,如何确定是否不需要新范围,新子范围或新隔离范围?.


编辑 我正在寻找如何实现ngRequire,因为ngRequire可以接受ng-require ="aFunction()",我在我的指令中使用$ parsers达到了这个目标.所以,我现在可以执行一个功能了! 我使用它做了一些进展,但我希望在我的指令中执行该函数的结果,我希望达到这样的效果

rangesToEval = //我的函数或表达式的结果.

查看具有ngRepeat的内容,我无法确定返回此函数的值的范围

if(attrs.notincluded) {
            var notIncludedValidator = function(value) {
            ngModelCtrl.$setValidity('notincluded', !attrs.notincluded);
            return value;
        };
    }
Run Code Online (Sandbox Code Playgroud)

一切运作良好,因为我使用的是一个布尔值,但是,我想用一个列表,在属性执行expresion的结果notincluded

//此输入是ng-repeat的一部分

<input type="text" ng-model="commission.date" ng-required="true" notincluded="filterDatesFn({{$index}})" />
Run Code Online (Sandbox Code Playgroud)

我在我的控制器中有这个功能:

$scope.filterDatesFn = function(index) {
        // in this list, we will add the dates of the defined commissions
        if($scope.addedCommisionsDate) {
            var listToEvalue= [];
            for ( …
Run Code Online (Sandbox Code Playgroud)

javascript angularjs angularjs-directive

7
推荐指数
1
解决办法
4617
查看次数

为什么格式化程序不适用于隔离范围?

为什么格式化程序不适用于隔离范围?这是有角度的错误还是我做错了什么?

这包含隔离范围,不起作用:http://jsfiddle.net/YbdXQ/56/

 restrict: 'A',
 scope:{},
 link: function(scope, elm, attrs, ctrl) {
      ctrl.$formatters.unshift(function(modelValue) {
          console.log("In formatters" + modelValue);
         return $filter('date')(modelValue);
     });
Run Code Online (Sandbox Code Playgroud)

这不包含隔离和范围工作正常:http://jsfiddle.net/YbdXQ/57/

 restrict: 'A',
 link: function(scope, elm, attrs, ctrl) {
      ctrl.$formatters.unshift(function(modelValue) {
          console.log("In formatters" + modelValue);
         return $filter('date')(modelValue);
     });
Run Code Online (Sandbox Code Playgroud)

angularjs angularjs-scope

5
推荐指数
1
解决办法
1929
查看次数

Angular两个不同的指令具有相同的控制器共享范围

我正在创建两个使用相同控制器的指令,因此我看到两个指令在控制器之间共享数据.我想要的是每个指令的数据都是UNIQUE,因此不应该共享数据.

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

app.controller('myCtrl', function($scope){
  $scope.data = {
    name: 'Javier'
  };
});


app.directive('dir1', function(){
  return {
    template: "<div style='background:red'><input type='text' ng-model='data.name'>{{data.name}}</div>",
    controller: "myCtrl"
  };
});


app.directive('dir2', function(){
  return {
    template: "<div style='background:yellow'><input type='text' ng-model='data.name'>{{data.name}}</div>",
    controller: "myCtrl"
  };
});
Run Code Online (Sandbox Code Playgroud)

https://jsbin.com/vetikuvada/1/edit?html,js,output

因此,在我的示例中,我想要的是当我在其中一个文本框中编辑文本时,它不会触发其他文本框中的更改.我知道控制器部署了不同的实例,但不知怎的,它们共享范围,我需要完全不同.这可能吗?

该示例是一个非常复杂的应用程序的一小部分,所以我必须能够使用这种方法而不是其他方法.

javascript angularjs angularjs-directive angularjs-scope angularjs-controller

0
推荐指数
1
解决办法
2378
查看次数