嗨我玩角度模态实例..
但是当我在模态控制器中声明一个querySelector时,它会给出无法读取属性的控制台错误' querySelector'为null
HTML
<body>
<div id="signature-pad">
<canvas width="300" height="300"></canvas>
<div class="description">Sign above</div>
<button class="button clear" data-action="clear">Clear</button>
</div>
</body>
<div class="modal-footer">
<button class="btn btn-success btn-lg" ng-click="ok();">Gem & Godkend</button>
<button class="btn btn-warning btn-lg" ng-click="cancel()">Annuler</button>
</div>
JS - ModalInstanceController
var ModalInstanceCtrl = function ($scope, $modalInstance) {
$scope.init = function() {
var wrapper = document.getElementById("signature-pad"),
clearButton = wrapper.querySelector("[data-action=clear]"),
canvas = wrapper.querySelector("canvas"),
signaturePad;
signaturePad = new SignaturePad(canvas);
clearButton.addEventListener("click", function (event) {
signaturePad.clear();
});
$scope.ok = function () {
$modalInstance.close(signaturePad.toDataURL());
};
$scope.cancel = function () {
$modalInstance.dismiss('cancel');
};
};
$modalInstance.opened.then($scope.init);
};
所以接缝就像它,在模型中找不到dom元素..:s
正如我可以尝试加载,首先使用$modalInstance.opened.then($scope.init);
建模到dom
但这个工作要么
答案 0 :(得分:3)
Umm接缝需要首先加载DOM元素..在https://github.com/angular-ui/bootstrap/issues/2586
找到我的答案 $scope.init = function() {
var wrapper = document.getElementById("signature-pad"),
...
}
$modalInstance.opened.then($scope.init);
这首先初始化dom elemtens,因此查询选择器可以看到dom元素! :)
我只需要<div ng-init="init()"> in html
答案 1 :(得分:0)
在模板加载并注入DOM之前,实例化Controller。一般来说,在控制器中执行此类DOM操作并不是一个好主意。你应该为此创建指令。例如:
add.directive('signaturePad', function() {
return {
link: function(scope, element) {
var wrapper = element[0],
clearButton = wrapper.querySelector("[data-action=clear]"),
saveButton = wrapper.querySelector("[data-action=save]"),
canvas = wrapper.querySelector("canvas"),
signaturePad;
signaturePad = new SignaturePad(canvas);
clearButton.addEventListener("click", function (event) {
signaturePad.clear();
});
}
};
});
并像这样使用它:
<div signature-pad id="signature-pad">
<canvas width="100" height="100"></canvas>
<div class="description">Sign above</div>
<button class="button clear" data-action="clear">Clear</button>
<button class="button save" data-action="save">Save</button>
</div>
答案 2 :(得分:0)
我同意dfsk,这是一个更优雅的解决方案,只需确保,如果这是引导ui-tab的一部分,请不要忘记添加ng-if =&#34; activeTab = 2&#34;,其中2是签名板所在的零索引选项卡。 activeTab是包含当前选项卡的范围变量。等到DOM更新(通过$ timeout(fn(){}))。这可以很好地访问和处理canvas元素的正确尺寸。