【发布时间】:2016-01-09 20:50:51
【问题描述】:
我有一个角度指令,我用它来放置一个按钮表单。模板被隐藏,直到用户需要查看它。这是一个单独工作的简单模板,但是当我将它组合成更大的表单时,模板不会出现。
指令如下:
.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 sn-p:
<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!
所以只需将该模板函数包装在 scope.$apply 中,对吗?没有。当我这样做时......
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
因此,错误地包装范围显然是一个问题,但不确定如何修复它。有什么想法吗?
【问题讨论】:
标签: javascript angularjs templates