@@ -506,6 +506,26 @@ function modFnsToProps(modFns, props, elemName) {
506
506
507
507
}
508
508
509
+ function buildCheckMod ( modName , modVal ) {
510
+
511
+ return modVal ?
512
+ Array . isArray ( modVal ) ?
513
+ function ( block ) {
514
+ var i = 0 , len = modVal . length ;
515
+ while ( i < len )
516
+ if ( block . hasMod ( modName , modVal [ i ++ ] ) )
517
+ return true ;
518
+ return false ;
519
+ } :
520
+ function ( block ) {
521
+ return block . hasMod ( modName , modVal ) ;
522
+ } :
523
+ function ( block ) {
524
+ return block . hasMod ( modName ) ;
525
+ } ;
526
+
527
+ }
528
+
509
529
/** @namespace */
510
530
this . BEM = $ . inherit ( $ . observable , /** @lends BEM.prototype */ {
511
531
@@ -734,16 +754,16 @@ this.BEM = $.inherit($.observable, /** @lends BEM.prototype */ {
734
754
if ( this . _processingMods [ modId ] ) return _this ;
735
755
736
756
var elemName ,
737
- currentModVal = elem ?
757
+ curModVal = elem ?
738
758
_this . _getElemMod ( modName , elem , elemName = _this . __self . _extractElemNameFrom ( elem ) ) :
739
759
_this . getMod ( modName ) ;
740
760
741
- if ( currentModVal === modVal ) return _this ;
761
+ if ( curModVal === modVal ) return _this ;
742
762
743
763
this . _processingMods [ modId ] = true ;
744
764
745
765
var needSetMod = true ,
746
- modFnParams = [ modName , modVal , currentModVal ] ;
766
+ modFnParams = [ modName , modVal , curModVal ] ;
747
767
748
768
elem && modFnParams . unshift ( elem ) ;
749
769
@@ -753,7 +773,7 @@ this.BEM = $.inherit($.observable, /** @lends BEM.prototype */ {
753
773
754
774
! elem && needSetMod && ( _this . _modCache [ modName ] = modVal ) ;
755
775
756
- needSetMod && _this . _afterSetMod ( modName , modVal , elem , elemName ) ;
776
+ needSetMod && _this . _afterSetMod ( modName , modVal , curModVal , elem , elemName ) ;
757
777
758
778
delete this . _processingMods [ modId ] ;
759
779
}
@@ -767,9 +787,11 @@ this.BEM = $.inherit($.observable, /** @lends BEM.prototype */ {
767
787
* @protected
768
788
* @param {String } modName имя модификатора
769
789
* @param {String } modVal значение модификатора
790
+ * @param {String } oldModVal старое значение модификатора
770
791
* @param {Object } [elem] вложенный элемент
792
+ * @param {String } [elemName] имя элемента
771
793
*/
772
- _afterSetMod : function ( modName , modVal , elem ) { } ,
794
+ _afterSetMod : function ( modName , modVal , oldModVal , elem , elemName ) { } ,
773
795
774
796
/**
775
797
* Устанавливает модификатор у блока/вложенного элемента в зависимости от условия.
@@ -965,11 +987,12 @@ this.BEM = $.inherit($.observable, /** @lends BEM.prototype */ {
965
987
var baseBlock = blocks [ decl . baseBlock || decl . block ] || this ;
966
988
967
989
if ( decl . modName ) {
990
+ var checkMod = buildCheckMod ( decl . modName , decl . modVal ) ;
968
991
$ . each ( props , function ( name , prop ) {
969
992
$ . isFunction ( prop ) &&
970
993
( props [ name ] = function ( ) {
971
994
var method ;
972
- if ( this . hasMod ( decl . modName , decl . modVal ) ) {
995
+ if ( checkMod ( this ) ) {
973
996
method = prop ;
974
997
} else {
975
998
var baseMethod = baseBlock . prototype [ name ] ;
@@ -1530,8 +1553,10 @@ function init(domElem, uniqInitId) {
1530
1553
processParams ( params , domNode , blockName , uniqInitId ) ;
1531
1554
var block = uniqIdToBlock [ params . uniqId ] ;
1532
1555
if ( block ) {
1533
- block . domElem = block . domElem . add ( domElem ) ;
1534
- $ . extend ( block . params , params ) ;
1556
+ if ( block . domElem . index ( domNode ) < 0 ) {
1557
+ block . domElem = block . domElem . add ( domElem ) ;
1558
+ $ . extend ( block . params , params ) ;
1559
+ }
1535
1560
} else {
1536
1561
initBlock ( blockName , domElem , params ) ;
1537
1562
}
@@ -2162,10 +2187,11 @@ var DOM = BEM.DOM = BEM.decl('i-bem__dom',/** @lends BEM.DOM.prototype */{
2162
2187
* @private
2163
2188
* @param {String } modName имя модификатора
2164
2189
* @param {String } modVal значение модификатора
2165
- * @param {jQuery } [elem] DOM-элемент
2190
+ * @param {String } oldModVal старое значение модификатора
2191
+ * @param {jQuery } [elem] элемент
2166
2192
* @param {String } [elemName] имя элемента
2167
2193
*/
2168
- _afterSetMod : function ( modName , modVal , elem , elemName ) {
2194
+ _afterSetMod : function ( modName , modVal , oldModVal , elem , elemName ) {
2169
2195
2170
2196
var _self = this . __self ,
2171
2197
classPrefix = _self . _buildModClassPrefix ( modName , elemName ) ,
@@ -2180,7 +2206,10 @@ var DOM = BEM.DOM = BEM.decl('i-bem__dom',/** @lends BEM.DOM.prototype */{
2180
2206
( needDel ? '' : '$1' + classPrefix + modVal ) + '$3' ) :
2181
2207
needDel || $ ( this ) . addClass ( classPrefix + modVal ) ;
2182
2208
} ) ;
2183
- elemName && this . dropElemCache ( elemName , modName , modVal ) ;
2209
+
2210
+ elemName && this
2211
+ . dropElemCache ( elemName , modName , oldModVal )
2212
+ . dropElemCache ( elemName , modName , modVal ) ;
2184
2213
2185
2214
} ,
2186
2215
@@ -2726,14 +2755,16 @@ var DOM = BEM.DOM = BEM.decl('i-bem__dom',/** @lends BEM.DOM.prototype */{
2726
2755
* Хелпер для live-инициализации по инициализации другого блока
2727
2756
* @static
2728
2757
* @private
2758
+ * @param {String } event имя события
2729
2759
* @param {String } blockName имя блока, на инициализацию которого нужно реагировать
2730
2760
* @param {Function } callback обработчик, вызываемый после успешной инициализации в контексте нового блока
2731
2761
* @param {String } findFnName имя метода для поиска
2732
2762
*/
2733
- _liveInitOnBlockInit : function ( blockName , callback , findFnName ) {
2763
+ _liveInitOnBlockEvent : function ( event , blockName , callback , findFnName ) {
2734
2764
2735
2765
var name = this . _name ;
2736
- blocks [ blockName ] . on ( 'init' , function ( e ) {
2766
+
2767
+ blocks [ blockName ] . on ( event , function ( e ) {
2737
2768
var blocks = e . block [ findFnName ] ( name ) ;
2738
2769
callback && blocks . forEach ( function ( block ) {
2739
2770
callback . call ( block ) ;
@@ -2743,29 +2774,59 @@ var DOM = BEM.DOM = BEM.decl('i-bem__dom',/** @lends BEM.DOM.prototype */{
2743
2774
2744
2775
} ,
2745
2776
2777
+ /**
2778
+ * Хелпер для live-инициализации по событию другого блока на DOM-элементе текущего
2779
+ * @static
2780
+ * @protected
2781
+ * @param {String } event имя события
2782
+ * @param {String } blockName имя блока, на инициализацию которого нужно реагировать
2783
+ * @param {Function } callback обработчик, вызываемый после успешной инициализации в контексте нового блока
2784
+ */
2785
+ liveInitOnBlockEvent : function ( event , blockName , callback ) {
2786
+
2787
+ return this . _liveInitOnBlockEvent ( event , blockName , callback , 'findBlocksOn' ) ;
2788
+
2789
+ } ,
2790
+
2791
+ /**
2792
+ * Хелпер для live-инициализации по событию другого блока внутри текущего
2793
+ * @static
2794
+ * @protected
2795
+ * @param {String } event имя события
2796
+ * @param {String } blockName имя блока, на инициализацию которого нужно реагировать
2797
+ * @param {Function } [callback] обработчик, вызываемый после успешной инициализации в контексте нового блока
2798
+ */
2799
+ liveInitOnBlockInsideEvent : function ( event , blockName , callback ) {
2800
+
2801
+ return this . _liveInitOnBlockEvent ( event , blockName , callback , 'findBlocksOutside' ) ;
2802
+
2803
+ } ,
2804
+
2746
2805
/**
2747
2806
* Хелпер для live-инициализации по инициализации другого блока на DOM-элементе текущего
2807
+ * @deprecated использовать liveInitOnBlockEvent
2748
2808
* @static
2749
2809
* @protected
2750
2810
* @param {String } blockName имя блока, на инициализацию которого нужно реагировать
2751
2811
* @param {Function } callback обработчик, вызываемый после успешной инициализации в контексте нового блока
2752
2812
*/
2753
2813
liveInitOnBlockInit : function ( blockName , callback ) {
2754
2814
2755
- return this . _liveInitOnBlockInit ( blockName , callback , 'findBlocksOn' ) ;
2815
+ return this . liveInitOnBlockEvent ( 'init' , blockName , callback ) ;
2756
2816
2757
2817
} ,
2758
2818
2759
2819
/**
2760
2820
* Хелпер для live-инициализации по инициализации другого блока внутри текущего
2821
+ * @deprecated использовать liveInitOnBlockInsideEvent
2761
2822
* @static
2762
2823
* @protected
2763
2824
* @param {String } blockName имя блока, на инициализацию которого нужно реагировать
2764
2825
* @param {Function } [callback] обработчик, вызываемый после успешной инициализации в контексте нового блока
2765
2826
*/
2766
2827
liveInitOnBlockInsideInit : function ( blockName , callback ) {
2767
2828
2768
- return this . _liveInitOnBlockInit ( blockName , callback , 'findBlocksOutside' ) ;
2829
+ return this . liveInitOnBlockInsideEvent ( 'init' , blockName , callback ) ;
2769
2830
2770
2831
} ,
2771
2832
0 commit comments