角度模板不显示ng-hide

时间:2016-01-09 20:50:52

标签: javascript angularjs templates

我有一个角度指令,我用它来放置一个按钮形式。模板被隐藏,直到用户需要查看它。它是一个单独工作的简单模板,但是当我将它组合成更大的形式时,模板不会出现。

这是指令:

.directive('buttonToggle', function() {
                return {
                    restrict: 'A',
                    scope: {
                        myBtnArr: "="
                    },
                    template: '<button ng-click="click()">{{ myBtnTxt[myBtnArr] }}</button>',
                    link: function(scope) {
                        scope.myBtnTxt = ["AND", "OR", "NOT"];
                        scope.click = function() {
                            scope.myBtnArr = (scope.myBtnArr < 2 ? scope.myBtnArr + 1 : 0);
                        }
                    }
                };
            });

然后是有效的html:

<div button-toggle my-btn-arr=0></div>

不起作用的html代码段:

<tr ng-show="rowsShown >= 2"><td>Search by:</td><td><div button-toggle my-btn-arr=0></div><select ng-model="selection2" ng-options="option.text for option in options"></select><input type="text" size="20" ng-model="queryF2"><ng-md-icon icon="add_circle_outline" style="fill:#a9a9a9" ng-click="addSearchField();"></ng-md-icon> <ng-md-icon icon="remove_circle_outline" style="fill:#a9a9a9" ng-click="removeSearchField();"></ng-md-icon></td></tr>

当我在较大的部分(由与模板无关的控制器控制)中运行此html时,我收到此错误:

Error: [$compile:nonassign] Expression '0' used with directive 'buttonToggle' is non-assignable!

所以只需将该模板函数包装在范围内。$ apply right?不。当我那样做的时候......

link: function(scope) {
            scope.myBtnTxt = ["AND", "OR", "NOT"];
            scope.click = function() {
                scope.$apply ( function() {
                    scope.myBtnArr = (scope.myBtnArr < 2 ? scope.myBtnArr + 1 : 0);
                })
            }
        }

我收到此错误:

Error: [$rootScope:inprog] $apply already in progress

因此,显然是错误包装示波器的问题,但不确定如何修复它。有什么想法吗?

3 个答案:

答案 0 :(得分:7)

看起来您不想为my-btn-arr创建双向绑定。如果您只想将数据传递给指令而不是绑定到现有变量,请从link的属性参数中读取。

.directive('buttonToggle', function() {
    return {
      restrict: 'A',
      scope: {},
      template: '<button ng-click="click()">{{ myBtnTxt[myBtnArr] }</button>',
      link: function(scope, elem, attr) {
        scope.myBtnArr = attr.myBtnArr;
        scope.myBtnTxt = ["AND", "OR", "NOT"];
        scope.click = function() {
          scope.myBtnArr = (scope.myBtnArr < 2 ? scope.myBtnArr + 1 : 0);
        }
      }
    }
  });

如果您还希望将变量作为输入传递,请使用$parse

// This won't work with an isolated scope, inherit from parent scope instead
scope : true, 
link: function(scope, elem, attr) {
  // this will evaluate the expression against the scope
  scope.myBtnArr = $parse(attr.myBtnArr)(scope);
}

现在您可以将指令用作

 <div button-toggle my-btn-arr="0"></div>
 <div button-toggle my-btn-arr="view.myValue"></div>

如果您确实想要使用双向绑定,则必须可以将值写回到使用表达式my-btn-arr定义的路径中。因此,如果使用scope: { myBtnArr: "=" },则必须使用带有可写表达式的指令,如下所示:

 <div button-toggle my-btn-arr="view.myValue"></div>
 <!-- "0" is not assignable-->
 <div button-toggle my-btn-arr="0"></div>

示例http://jsfiddle.net/Lw7ckt9x/1/

答案 1 :(得分:4)

不要使用链接功能,而是尝试在控制器功能下执行相同的操作。当您对控制器应该足够的功能进行任何DOM操作时,需要链接功能。

答案 2 :(得分:2)

ngdocs上查看此错误。

你用这个:

<div button-toggle my-btn-arr=0></div>

0不可转让。这意味着你不能做0 = 1;

您必须传递值为0的变量,而不是普通0 像这样:

<div button-toggle my-btn-arr="obj.myvar"></div>