วิธีอัปเดตตัวแปรด้วยค่าอินพุตในไฟล์ .less แบบไดนามิกโดยใช้ AngularJS

ฉันรู้ว่ามีการถามคำถามรูปแบบนี้มาก่อน (ดู 28208451) อย่างไรก็ตาม ฉันต้องได้รับค่าอินพุตแล้วตั้งค่าเป็นค่าใหม่เพื่อให้ฟิลด์อินพุตอื่นสามารถเข้าถึงได้ นี่คือลิงก์ไปยัง plunk ของฉัน

ฉันสามารถป้อนเฉดสีใหม่ได้ แต่จะไม่บันทึกเมื่อฉันพยายามเปลี่ยนความอิ่มสีหรือความสว่าง ฉันแน่ใจว่ามันเป็นการแก้ไขที่ง่าย (อาจเป็นคำสั่ง) แต่สำหรับชีวิตของฉัน ฉันไม่สามารถคลุมศีรษะได้ ฉันยังค่อนข้างใหม่กับ AngularJS ... ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม

**controller:** 
angular.module('colorChanger', [])
    .controller('ColorController', [

      function() {
        var vm = this;

        vm.hue = '194.3';
        vm.saturation = '100';
        vm.lightness = '50';
        vm.newHue = function() {
          if (vm.hue) {
            less.modifyVars({
              hue: vm.hue
            });
          }
        };
        vm.newSaturation = function() {
          if (vm.saturation) {
            less.modifyVars({
              saturation: vm.saturation
            });
          }
        };
        vm.newLightness = function() {
          if (vm.lightness) {
            less.modifyVars({
              lightness: vm.lightness
            });
          }
        };
      }

    ]);

**index:**
<ul>
  <li class="bgc-color-base"></li>
</ul>

<form data-ng-submit="color.newHue()" data-ng-controller="ColorController as color">
  <label for="hue">Hue:</label>
  <input type="text" id="hue" data-ng-model="color.hue" />
  <input type="submit" value="Submit" />
</form>
<form data-ng-submit="color.newSaturation()" data-ng-controller="ColorController as color">
  <label for="saturation">Saturation:</label>
  <input type="text" id="saturation" data-ng-model="color.saturation" />
  <input type="submit" value="Submit" />
</form>
<form data-ng-submit="color.newLightness()" data-ng-controller="ColorController as color">
  <label for="lightness">Lightness:</label>
  <input type="text" id="lightness" data-ng-model="color.lightness" />
  <input type="submit" value="Submit" />
</form>

**less:**
ul {
  list-style: none;
  padding: 0;
  margin-bottom: 20px;
  li {
    height: 100px;
    &.bgc-color-base {
    .background-base;
    }
  }
}    

//== color variables
@hue: 194.3; // enter optional hue variable or custom hue range 0-330
@saturation: 100; // saturation range 0-100
@lightness: 50; // lightness range 0-100 (0 = black, 100 = white)
@alpha: 1;

//== base color function
@color-base: hsla(@hue, (@saturation/100), (@lightness/100), @alpha);

//== base color mixins
.background-base(@hue: @hue, @saturation: @saturation, @lightness: @lightness, @alpha: @alpha) {
 background: @color-base;
}

person MelissaMMDP    schedule 29.05.2015    source แหล่งที่มา
comment
ฉันไม่แน่ใจว่ากรณีการใช้งานอยู่ที่นี่คืออะไร แต่โปรดจำไว้ว่าตามเอกสารน้อยกว่า 'เราขอแนะนำให้ใช้น้อยลงในเบราว์เซอร์เพื่อการพัฒนาเท่านั้น' - หากเป้าหมายคือการมีพื้นหลังที่อัปเดตได้แบบไดนามิก คุณสามารถใช้คำสั่งแบบ ng เพื่อตั้งค่าสไตล์อินไลน์บน องค์ประกอบ. ฉันได้ อัปเดต plunkr ของคุณ แล้ว โดยส่วนตัวแล้ว ฉันคิดว่าการแก้ไขในเบราว์เซอร์ควรได้รับการจัดการด้วยคลาสหรือสไตล์อินไลน์ แทนที่จะเกี่ยวข้องน้อยลง   -  person Matthew de Nobrega    schedule 29.05.2015
comment
ฉันเห็นด้วยกับคุณและโดยปกติแล้วฉันจะไม่พยายาม แต่ฉันต้องการสร้างการสาธิตสดในแอปพลิเคชันที่ฉันกำลังสร้างเพื่อสาธิตเบื้องหลังการสร้างโทนสีโดยใช้น้อยลง นี่คือปากกาที่แสดงโค้ดน้อยกว่า ฉันรู้ว่าสิ่งนี้ได้ทำไปแล้วด้วย codepen แต่ฉันคิดว่ามันคงจะสนุกดีถ้าจะสร้างแอปพลิเคชันที่มีการโต้ตอบกับผู้ใช้ที่ไม่จำเป็นต้องเปลี่ยนตัวแปรเฉดสี ความอิ่มตัวของสี และความสว่างด้วยตนเอง   -  person MelissaMMDP    schedule 29.05.2015
comment
จริงๆ แล้ว ไม่ว่าจะด้วยวิธีใดก็ตาม จะต้องมีการแก้ไขตัวแปร แต่การอนุญาตให้ผู้ใช้โต้ตอบในหน้าต่างจะเป็นแบบไดนามิกมากกว่า จากนั้นจะต้องแก้ไขโค้ดน้อยลงด้วยตนเอง อย่างไรก็ตาม ตอนนี้ฉันเชื่อว่าการฝังปากกาเป็นหนทางที่ดีกว่า ฉันคิดว่าฉันมัวแต่จมอยู่กับการทำงานจนลืมไปว่ามันควรจะเป็นหรือไม่ ;) ขอบคุณสำหรับความช่วยเหลือทั้งหมดของคุณ!   -  person MelissaMMDP    schedule 29.05.2015


คำตอบ (1)


คุณควรมีคอนโทรลเลอร์ทั่วไปสำหรับอินพุตทั้งสามอินพุต มิฉะนั้นการเปลี่ยนแปลงค่าขอบเขตในคอนโทรลเลอร์ตัวหนึ่งจะไม่สามารถใช้ได้กับคอนโทรลเลอร์อีกตัวหนึ่ง

หรือ

หากคุณต้องการคงการใช้คอนโทรลเลอร์แยกกัน คุณจะต้องสร้างบริการที่จะเก็บค่าของตัวแปรทั้งหมดไว้ ที่จะแบ่งปันคุณค่าเหล่านั้นไปทั่ว

สร้างวิธีการเดียวสำหรับการอัปเดตตัวแปรน้อยลงซึ่งจะทำเคล็ดลับให้กับคุณ

มาร์กอัป

<body data-ng-app="colorChanger" data-ng-controller="ColorController as color">
  <ul>
    <li class="bgc-color-base"></li>
  </ul>

  <form data-ng-submit="color.updateColor()" >
    <label for="hue">Hue:</label>
    <input type="text" id="hue" data-ng-model="color.hue" />
    <input type="submit" value="Submit" />
  </form>
  <form data-ng-submit="color.updateColor()"">
    <label for="saturation">Saturation:</label>
    <input type="text" id="saturation" data-ng-model="color.saturation" />
    <input type="submit" value="Submit" />
  </form>
  <form data-ng-submit="color.updateColor()">
    <label for="lightness">Lightness:</label>
    <input type="text" id="lightness" data-ng-model="color.lightness" />
    <input type="submit" value="Submit" />
  </form>

</body>

รหัส

vm.updateColor = function() {
    less.modifyVars({
        hue: vm.hue || 194.3,
        saturation: vm.saturation || 100,
        lightness: vm.lightness || 50
    });
};

และบน html แทนที่จะเรียกสามวิธีบน ng-submit ให้เรียกเพียงวิธีเดียวเท่านั้น vm.updateColor ที่จะทำ less.modifyVars กับตัวแปรทั้งสามตัว

เดโม่ Plunkr

person Pankaj Parkar    schedule 29.05.2015
comment
คุณยอดเยี่ยมมาก! ขอบคุณมาก. คุณไม่รู้หรอกว่ามันดีแค่ไหนที่ได้เห็นสีที่ฉันต้องการจริงๆ ... ฮ่าๆ! - person MelissaMMDP; 29.05.2015
comment
ฉันรู้สึกเหมือนในที่สุดฉันก็ปิดตัวลง ;) - person MelissaMMDP; 29.05.2015