【发布时间】:2014-11-05 17:45:04
【问题描述】:
我有一个弹出气泡指令,其中要在弹出窗口中显示的按钮在属性中作为对象数组提供:
JS(控制器)
$scope.buttons = [{ label: 'OK' }, { label: 'Cancel' }]
指令如下所示:
HTML
<ui-popup buttons="buttons"></ui-popup>
JS(指令)
'use strict';
angular
.module('ui')
.directive('uiPopup', [function () {
return {
replace: true,
restrict: 'E',
transclude: true,
templateUrl: '/uikit/views/ui-popup.html',
scope: {
buttons: '=',
anchor: '@',
x: '@',
y: '@'
},
link: function ($scope, element, attrs, ngModel) {
...
}
};
}]);
这很好用。但是,我需要从气泡中没有按钮开始,然后在应用程序中发生事件时添加按钮。所以我从一个空数组开始,并使用$scope.buttons.push(obj) 添加每个按钮。请注意,我正在维护原始数组,而不是替换数组,因此不应破坏数据绑定。但是,新按钮没有出现在气泡中,并且调试显示该按钮没有添加到指令范围内。
经过实验,我偶然发现如果我从一个非空数组开始然后添加它就可以了。为什么角度数据绑定会在空数组上中断?我可以做些什么来解决这个问题?
编辑
该事件在ng-click 上调用,如下所示:
JS(控制器)
$scope.onClick = function () {
$scope.locked = true;
$scope.buttons.push({ label: 'OK' });
};
【问题讨论】:
-
如何绑定事件?您可能需要在事件处理程序中使用
$scope.$apply()。 -
好建议@AnthonyChu。它来自
ng-click,所以$apply()块不应该是问题。 -
数组的原始长度很重要,这很奇怪。你可以在小提琴中重新创建吗?提炼了我对您的问题的理解,但无论数组最初是否为空,它似乎都可以工作......jsfiddle.net/0xnotggr
-
jsfiddle.net/dizel3d/t0qagtc1 看起来像你的例子?
-
我唯一的理论是空数组可能有一些内存巫术正在阻止绑定正常工作。不过有点牵强。
标签: javascript angularjs angular-directive