gpt4 book ai didi

javascript - 作用域之间的双向数据绑定(bind)

转载 作者:行者123 更新时间:2023-12-03 09:32:22 25 4
gpt4 key购买 nike

我创建了 3 个指令,一个 XY 区域 slider 、一个 X slider 和一个使用其他两个指令的 ColorPicker 指令。

除了在共享同一模型时能够让它们一起移动之外,我已经完成了所有工作。

View Plunker

在上面的 Plunker 中,您可以找到完整的源代码并了解我关于他们没有正确共享模型的意思。我希望这样当一个 slider 移动时,它们都会移动。

这些值在第三个(颜色选择器)指令中正确更新,所以我相信这就是问题所在。

颜色选择器指令:

angular.module('plunker').directive('isColorPicker', IsColorPicker);

IsColorPicker.$inject = [];

function IsColorPicker() {
'use strict';

return {
restrict: 'EA',
scope: {
color: '='
},
template: [
'<div class="is-color-picker">',
' <div style="background: {{ color.hueHex }}" class="hsv-container">',
' <is-xy-field values="xyValues"></is-xy-field>',
' </div>',
' <div class="hue-container">',
' <is-slider max="360" value="hueValue"></is-slider>',
' </div>',
'</div>'
].join(''),
replace: true,
controller: ['$scope', function($scope) {
$scope.hueValue = 0;
$scope.xyValues = {
x: 100,
y: 100
};

updateColors();

$scope.$watch('xyValues', function(value) {
updateColors();
}, true);

$scope.$watch('hueValue', function(value) {
updateColors();
}, true);

function updateColors() {
var hsl = {
h: parseInt($scope.hueValue),
s: $scope.xyValues.x / 100,
v: $scope.xyValues.y / 100
};

$scope.color = hsv2rgb(hsl.h, hsl.s, hsl.v);
$scope.color.hsl = hsl;
$scope.color.hueHex = hsv2rgb(hsl.h, 1, 1).hex;
}

function hsv2rgb(h, s, v) {
var R, G, B, X, C;
h = (h % 360) / 60;
C = v * s;
X = C * (1 - Math.abs(h % 2 - 1));
R = G = B = v - C;

h = ~~h;
R += [C, X, 0, 0, X, C][h];
G += [X, C, C, X, 0, 0][h];
B += [0, 0, X, C, C, X][h];

var r = R * 255,
g = G * 255,
b = B * 255;
return {
r: r,
g: g,
b: b,
hex: "#" + (16777216 | b | (g << 8) | (r << 16)).toString(16).slice(1)
};
}
}],
}
}

最佳答案

所以问题似乎是,对于每个单独的颜色选择器,您都创建了自己独立的 HueValue 范围。您需要从主 Controller 提供一个共享的hueValue变量。我对您的代码做了一些修改,并将在下面显示。

HTML

<div class="pickers">
<is-color-picker color="colorObj" hue-value="colorObj.hsl.h"></is-color-picker>
<is-color-picker color="colorObj" hue-value="colorObj.hsl.h" class="is-color-picker2"></is-color-picker>
<is-color-picker color="colorObj" hue-value="colorObj.hsl.h" class="is-color-picker3"></is-color-picker>
</div>

我添加了色调值属性,该属性将在所有颜色选择器之间同步。

isColorPicker.js

scope: {
color: '=',
hueValue: "=" //This line is new, this is the hue-value from the html
}

这是一个 fork 的plunker

更新

plunker

由于目标是消除 HTML 代码中的额外色调值,因此现在看起来像这样:

HTML

<body ng-controller="MainCtrl">
<div class="pickers">
<is-color-picker color="colorObj"></is-color-picker>
<is-color-picker color="colorObj" class="is-color-picker2"></is-color-picker>
<is-color-picker color="colorObj" class="is-color-picker3"></is-color-picker>
</div>

Hue Value: {{ colorObj.hueValue }} <br>
Hue Color:
<div style="background: {{ colorObj.hueHex }}" class="hue-preview"></div><br>
Selected Color: <div style="background: {{ colorObj.hex }}" class="hue-preview"></div>
</body>

所有 colorObj 现在都包含一个名为 HueValue 的额外变量,它反射(reflect)了我们在三个颜色选择器之一中设置的色调。

isColorPicker.js

template: [
'<div class="is-color-picker">',
' <div style="background: {{ color.hueHex }}" class="hsv-container">',
' <is-xy-field values="xyValues"></is-xy-field>',
' </div>',
' <div class="hue-container">',
' <is-slider max="360" value="color.hueValue"></is-slider>',
' </div>',
'</div>'
].join(''),

这里的重要变化是它现在显示的是 color.hueValue 而不是 hueValue

此外, Controller 初始化更改为:

$scope.xyValues = {
x: 100,
y: 100
};
$scope.color = hsv2rgb(0, 1, 1); //This creates the color object so we can assign the needed color.hueValue variable
$scope.color.hueValue = 0;

$scope.$watch 已更改为:

$scope.$watch('color.hueValue', function(value) {
updateColors();
}, true);

最后函数updateColors改成这样

function updateColors() {
var hsl = {
h: parseInt($scope.color.hueValue),
s: $scope.xyValues.x / 100,
v: $scope.xyValues.y / 100
};

$scope.color = hsv2rgb(hsl.h, hsl.s, hsl.v);
$scope.color.hsl = hsl;
$scope.color.hueValue = hsl.h;
$scope.color.hueHex = hsv2rgb(hsl.h, 1, 1).hex;
}

关于javascript - 作用域之间的双向数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31461715/

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