代码之家  ›  专栏  ›  技术社区  ›  Enrico Casanova

使用颜色选择器更改可观察数组中对象的属性

  •  1
  • Enrico Casanova  · 技术社区  · 6 年前

    我必须在标题的两种颜色上使用数据绑定(一种用于背景,一种用于文本),但我不想创建两个单独的观察对象,只想创建一个具有两个属性的单个对象的数组:MainColor和SecondaryColor,用十六进制值初始化。(每个属性的颜色选择器会更改颜色)

    我试过这种方法,但不起作用: (js文件)

    function mainViewModel() {
    var self = this;
    
        self.model = new function () {
            var model = this;
            model.myColor = ko.observable([{
                MainColor: '#0080C0',
                SecondaryColor: '#001111'
            }]);
        }
    
    /* applyBindings is written in another method */
    
        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;                   
                     },  
    
                    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');
            };
    }
    

    (cshtml文件)

    <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>
    

    我已经验证了所有这些代码都是使用单个可观察变量工作的,例如:

    model.MainColor = ko.observable('#0080C0');
    

    但这不是我应该遵循的方式,有什么想法可以阻止颜色的变化吗?

    2 回复  |  直到 6 年前
        1
  •  0
  •   A Nice Guy    6 年前

    问题可能是因为 MainColor SecondaryColor 它们本身是不可见的。淘汰赛的“可观察性”不会自动下降。
    此外,由于您使用的是数组,因此最好使用 observableArray 而不是简单的观察。

    您的声明将变成:

    model.myColor = ko.observableArray([{
                MainColor: ko.observable('#0080C0'),
                SecondaryColor: ko.observable('#001111')
            }]);
    

    注意:您的其余代码将根据这一点进行相应的更改。

        2
  •  0
  •   tomasantunes    6 年前

    “颜色”选项仅定义初始值。尝试以下操作:

    <!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>