In Ruby, können Sie einfach eine Variable aus innerhalb einer Methode in den beigefügten Codeblock übergeben:Eine Variable innerhalb einer Mixin-Deklaration in den angehängten Inhaltsblock übergeben?
def mymethod
(1..10).each { |e| yield(e * 10) } # Passes a number to associated block
end
mymethod { |i| puts "Here comes #{i}" } # Outputs the number received from the method
Ich möchte die gleiche Sache in SASS mixin tun:
=my-mixin
@for $i from 1 to 8
.grid-#{$i}
@content
+my-mixin
color: nth("red green blue orange yellow brown black purple", $i)
Dieser gewonnen Code Es funktioniert nicht, weil $ i innerhalb der Mixin-Deklaration deklariert ist und nicht im Freien zu sehen ist, wo das Mixin verwendet wird. :(
So ... Wie nutzen i Variablen innerhalb der mixin Deklaration deklariert?
Wenn ich mit einem Gitterrahmen und Medienabfragen arbeiten, ich brauche diese Funktionalität schlecht. Zur Zeit muss ich duplizieren, was innerhalb der ist jedes Mal, wenn ich es mixin Erklärung benötigen, die DRY-Regel zu verletzen.
UPD 2013-01-24
Hier ist ein Beispiel aus der Praxis.
ich habe eine mixi n, die Zyklen durch Haltepunkte und einmal den bereitgestellten Code gelten für jeden Unterbrechungspunkt:
=apply-to-each-bp
@each $bp in $bp-list
+at-breakpoint($bp) // This is from Susy gem
@content
Wenn ich diesen mixin ich diesen $ bp Wert innerhalb @content verwenden. Es könnte so aussehen:
// Applies to all direct children of container
.container > *
display: inline-block
// Applies to all direct children of container,
// if container does not have the .with-gutters class
.container:not(.with-gutters) > *
+apply-to-each-bp
width: 100%/$bp
// Applies to all direct children of container,
// if container has the .with-gutters class
.container.with-gutters > *
+apply-to-each-bp
$block-to-margin-ratio: 0.2
$width: 100%/($bp * (1 + $block-to-margin-ratio) - $block-to-margin-ratio)
width: $width
margin-right: $width * $block-to-margin-ratio
&:nth-child(#{$bp})
margin-right: 0
Aber das wird nicht funktionieren, weil der Wert von $ bp nicht verfügbar innerhalb @content ist.
Das Deklarieren der Variablen vor dem Aufruf des Mixins hilft nicht, weil @content einmal analysiert wird und bevor das Mixin geparst wird.
Stattdessen ich jedes Mal muß, dass, ich habe zwei hässliche Oberschenkel zu tun:
- einen Ad-hoc-mixin erklären,
- schreiben den Zyklus, Verstoß gegen das DRY-Prinzip:
// Each of the following mixins is mentioned in the code only once.
=without-gutters($bp)
width: 100%/$bp
=with-gutters($bp)
$block-to-margin-ratio: 0.2
$width: 100%/($bp * (1 + $block-to-margin-ratio) - $block-to-margin-ratio)
width: $width
margin-right: $width * $block-to-margin-ratio
&:nth-child(#{$bp})
margin-right: 0
// Applies to all direct children of container
.container > *
display: inline-block
// Applies to all direct children of container,
// if container does not have the .with-gutters class
.container:not(.with-gutters) > *
@each $bp in $bp-list
+at-breakpoint($bp) // This is from Susy gem
+without-gutters($bp)
// Applies to all direct children of container,
// if container has the .with-gutters class
.container.with-gutters > *
@each $bp in $bp-list // Duplicate code! :(
+at-breakpoint($bp) // Violates the DRY principle.
+with-gutters($bp)
Also, die Frage ist: gibt es eine Möglichkeit, diese Ruby-Stil zu tun?
Sehr geehrter Cimmanon, die von Ihnen vorgeschlagene Lösung trifft nicht auf die Situation zu. Ich habe meine erste Frage bearbeitet, um ein gründliches und fast realistisches Beispiel dessen hinzuzufügen, wonach ich suche. Bitte werfen Sie einen Blick und schreiben Sie Ihre Überlegungen. –