【问题标题】:Change properties of an object in an observable array with a Colorpicker使用颜色选择器更改可观察数组中对象的属性
【发布时间】:2018-09-19 18:58:53
【问题描述】:

我必须在标题的两种颜色上使用数据绑定(一种用于背景,一种用于文本),但我不想创建两个单独的可观察对象,只是一个具有两个属性的单个对象的数组: 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');

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

【问题讨论】:

    标签: javascript razor knockout.js observable color-picker


    【解决方案1】:

    问题可能是因为MainColorSecondaryColor 本身不是可观察的。Knockout 的“可观察性”不会自动下降。
    另外,由于您使用的是数组,因此最好使用 observableArray 而不是简单的 observable。

    然后您的声明将变为:

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

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

    【讨论】:

      【解决方案2】:

      颜色选项只定义初始值。试试这个:

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

      【讨论】:

        猜你喜欢
        • 2016-01-21
        • 1970-01-01
        • 2014-10-23
        • 1970-01-01
        • 1970-01-01
        • 2019-09-09
        • 2019-06-02
        • 1970-01-01
        • 2017-08-09
        相关资源
        最近更新 更多