gpt4 book ai didi

javascript - Angular 变量未绑定(bind)到 View

转载 作者:搜寻专家 更新时间:2023-10-31 22:41:52 25 4
gpt4 key购买 nike

我有一个 Angular/Onsen 应用程序,它有一个图像被放入 HTML5 canvas tag 中,我正在选择我在 hover 上的像素的颜色。

View 非常简单:

  <ons-template id="live.html">
<ons-page ng-controller="LiveController">
<ons-toolbar>
<div class="left">
<ons-toolbar-button ng-click="menu.toggle()">
<ons-icon icon="ion-navicon" size="28px" fixed-width="false"></ons-icon>
</ons-toolbar-button>
</div>
<div class="center">Live Camera</div>
</ons-toolbar>



<canvas id="canvas" width="100" height="100"></canvas>

<p>#{{hex}}</p>

</ons-page>
</ons-template>

您可以在那里看到 <p> 标签应该显示 $scope.hex 的值(像素 rgb channel 的计算十六进制值),但它不是。即使从我的 Controller 记录了正确的值。

这是我的 Controller :

  module.controller('LiveController', function($scope, $data) {

$scope.hex = '00FFFF';
var pictureSource;
var destinationType;

document.addEventListener("deviceready", onDeviceReady, true);

function onDeviceReady() {
console.log('onDeviceReady');
pictureSource = navigator.camera.PictureSourceType;
destinationType = navigator.camera.DestinationType;
capturePhoto();

}

function capturePhoto() {
console.log('capturePhoto');
navigator.camera.getPicture(onSuccess, onFail, {
quality: 50,
destinationType: destinationType.DATA_URL
});
}

function onSuccess(imageData) {
console.log('onSuccess');
var largeImage = document.getElementById('largeImage');
largeImage.style.display = 'block';
largeImage.src = "data:image/jpeg;base64," + imageData;
setupImage(imageData);
}

function onFail(message) {
console.log('Failed because: ' + message);
}

function getMousePos(canvas, evt) {
var rect = canvas.getBoundingClientRect();
return {
x: evt.clientX - rect.left,
y: evt.clientY - rect.top
};
}

function init(imageObj) {
console.log('init');

var padding = 10;
var mouseDown = false;

var canvas = document.getElementById('canvas');
var context = canvas.getContext('2d');
context.strokeStyle = '#444';
context.lineWidth = 2;
context.canvas.width = window.innerWidth;
context.canvas.height = window.innerWidth;

canvas.addEventListener('mousedown', function() {
mouseDown = true;
}, false);

canvas.addEventListener('mouseup', function() {
mouseDown = false;
}, false);

canvas.addEventListener('mousemove', function(evt) {
console.log('mousemove');

var mousePos = getMousePos(canvas, evt);
var color = undefined;

if (mouseDown && mousePos !== null && mousePos.x > padding && mousePos.x < padding + imageObj.width && mousePos.y > padding && mousePos.y < padding + imageObj.height) {
var imageData = context.getImageData(padding, padding, imageObj.width, imageObj.width);
var data = imageData.data;
var x = mousePos.x - padding;
var y = mousePos.y - padding;
var red = data[((imageObj.width * y) + x) * 4];
var green = data[((imageObj.width * y) + x) * 4 + 1];
var blue = data[((imageObj.width * y) + x) * 4 + 2];
var color = 'rgb(' + red + ',' + green + ',' + blue + ')';
console.log('picked color is ' + color);
updateColor(red, green, blue);
}
}, false);

context.drawImage(imageObj, padding, padding);
}

function updateColor(R, G, B) {
$scope.hex = rgbToHex(R, G, B);
console.log($scope.hex);
}

function rgbToHex(R, G, B) {
return toHex(R) + toHex(G) + toHex(B)
}

function toHex(n) {
n = parseInt(n, 10);
if (isNaN(n)) {
return "00";
}
n = Math.max(0, Math.min(n, 255));
return "0123456789ABCDEF".charAt((n - n % 16) / 16) + "0123456789ABCDEF".charAt(n % 16);
}

function setupImage(_data) {
console.log('setupImage');

var imageObj = new Image();
imageObj.onload = function() {
init(this);
};
imageObj.src = "data:image/jpeg;base64," + _data;
}

});

重要的部分在 mousemove 事件监听器之后开始。我得到了很好的 RGB 值并将它们转换为十六进制。这一切都很好 - RGB 和 HEX。但是 $scope.hex 似乎从来没有绑定(bind)/更新 View 。请告知出了什么问题。

最佳答案

尝试将您的 updateColor() 函数编辑为如下所示。

function updateColor(R, G, B) {
$scope.hex = rgbToHex(R, G, B);
console.log($scope.hex);
$scope.$apply();
}

这应该有效。您可能遇到的问题是您正在更新 hex 的值,但 Angular 可能无法识别该更改。 $scope.$apply() 应该强制更新绑定(bind),从而解决您的问题。

关于javascript - Angular 变量未绑定(bind)到 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32919761/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com