我必须在标题的两种颜色上使用数据绑定(一种用于背景,一种用于文本),但我不想创建两个单独的可观察对象,只是一个具有两个属性的单个对象的数组:MainColor和SecondaryColor使用十六进制值初始化。 (每个属性的颜色选择器会改变颜色)
我试过这种方式,但它不起作用: (js文件)
<div class="slideshow" data-bind="style: { 'backgroundColor' : model.myColor().MainColor }">
<div class="slideshow-header slideshow-elements" data-bind="style: { 'backgroundColor' : model.myColor().MainColor, 'color' : model.MyColor().SecondaryColor }"></div>
<div class="slideshow-button slideshow-elements" data-bind="style: { backgroundColor : model.myColor().MainColor, color : model.myColor().SecondaryColor }">#Next Class</div>
</div>
(cshtml文件)
model.MainColor = ko.observable('#0080C0');
我已经验证所有这些代码都使用单个可观察变量,例如:
{{1}}
但这不是我应该遵循的方式,对可能阻止颜色变化的任何想法?
答案 0 :(得分:0)
问题可能是因为MainColor
和SecondaryColor
本身不可观察。解决方案的可观察性&#39;没有自动滴下来。
另外,由于您使用的是数组,因此最好使用observableArray而不是简单的observable。
您的声明将变为类似:
model.myColor = ko.observableArray([{
MainColor: ko.observable('#0080C0'),
SecondaryColor: ko.observable('#001111')
}]);
注意:鉴于此,您的其余代码必须相应更改。
答案 1 :(得分:0)
颜色选项仅定义初始值。试试这个:
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="colpick/css/colpick.css" type="text/css"/>
</head>
<body>
<div class="slideshow" data-bind="style: { 'backgroundColor' : model.myColor.MainColor }">
<div class="slideshow-header slideshow-elements" data-bind="style: { 'backgroundColor' : model.myColor.MainColor, 'color' : model.myColor.SecondaryColor }"></div>
<div class="slideshow-button slideshow-elements" data-bind="style: { backgroundColor : model.myColor.MainColor, color : model.myColor.SecondaryColor }">#Next Class</div>
</div>
<button id="MainColorButton" data-bind="value: model.myColor.MainColor">Main Color</button>
<button id="SecondaryColorButton" data-bind="model.myColor.SecondaryColor">Secondary Color</button>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<script src="colpick/js/colpick.js" type="text/javascript"></script>
<script>
function mainViewModel() {
var self = this;
self.model = new function () {
var model = this;
model.myColor = ko.observable([{
MainColor: '#0080C0',
SecondaryColor: '#001111'
}]);
}
self.domUtils = new function () {
var domUtils = this;
domUtils.initColorPicker = function (selector) {
$('#' + selector + 'Button').colpick({
colorScheme: 'light',
layout: 'rgbhex',
submit: 0,
/*
color: function () {
if (selector == 'MainColor')
self.model.myColor()[0].MainColor;
else
self.model.myColor()[0].SecondaryColor;
},
*/
onChange: function (hsb, hex, rgb, el) {
if (selector == 'MainColor')
self.model.myColor()[0].MainColor = '#' + hex;
else
self.model.myColor()[0].SecondaryColor = '#' + hex;
console.log(self.model.myColor()[0].MainColor);
console.log(self.model.myColor()[0].SecondaryColor);
},
onShow: function (elem) {
var top = parseFloat($(elem).css('top').replace('px', ''));
var availableHeight = $(window).height();
if (top + $(elem).height() > availableHeight) {
$(elem).css('top', (availableHeight - $(elem).height() - 20) + 'px');
}
}
});
};
domUtils.initColorPickers = function () {
domUtils.initColorPicker('MainColor');
domUtils.initColorPicker('SecondaryColor');
};
}
self.domUtils.initColorPickers();
}
ko.applyBindings(new mainViewModel());
</script>
</body>
</html>