2016-09-20 75 views
0

我目前正在使用Marionette 2.4.1。木偶视图的正确视图生命周期是什么?

我有一个父布局视图(A)包含子布局视图(B)将显示到的区域。我在视图(B)上有一个onShow方法,在显示视图(B)时正确调用该方法。但是,在视图(B)上我有一个onEmptyonBeforeEmpty以期望在视图(B)隐藏时调用它们。这些是从视图(A)中调用的,我有一个函数可以清空视图(B)填充的区域,但是我在空的调用上通过{preventDestroy: true}

我的问题是,我/我期待视图(B)拿起对before:emptyempty触发时#empty从视图(A),但是,图(B)称为不拿起这些触发器被称为。甚至没有人认为(B)似乎也会接触到这些触发器。

这里的预期情况是什么?当通过木偶的源代码运行,我可以看到onBeforeEmpty触发器被称为按我的源代码:

Marionette._triggerMethod = (function() { 
    // split the event name on the ":" 
    var splitter = /(^|:)(\w)/gi; 

    // take the event section ("section1:section2:section3") 
    // and turn it in to uppercase name 
    function getEventName(match, prefix, eventName) { 
     return eventName.toUpperCase(); 
    } 

    return function(context, event, args) { 
     var noEventArg = arguments.length < 3; 
     if (noEventArg) { 
     args = event; 
     event = args[0]; 
     } 

     // get the method name from the event name 
     var methodName = 'on' + event.replace(splitter, getEventName); 
     var method = context[methodName]; 
     var result; 

     // call the onMethodName if it exists 
     if (_.isFunction(method)) { 
     // pass all args, except the event name 
     result = method.apply(context, noEventArg ? _.rest(args) : args); 
     } 

     // trigger the event, if a trigger method exists 
     if (_.isFunction(context.trigger)) { 
     if (noEventArg + args.length > 1) { 
      context.trigger.apply(context, noEventArg ? args : [event].concat(_.drop(args, 0))); 
     } else { 
      context.trigger(event); 
     } 
     } 

     return result; 
    }; 
    })(); 

这里就是我怀疑它触发方法onBeforeEmpty

// get the method name from the event name 
     var methodName = 'on' + event.replace(splitter, getEventName); 
     var method = context[methodName]; 

似乎像上下文是查看(A)。

Mariontte的区域#空:

// Destroy the current view, if there is one. If there is no 
    // current view, it does nothing and returns immediately. 
    empty: function(options) { 
     var view = this.currentView; 

     var preventDestroy = Marionette._getValue(options, 'preventDestroy', this); 
     // If there is no view in the region 
     // we should not remove anything 
     if (!view) { return; } 

     view.off('destroy', this.empty, this); 
     this.triggerMethod('before:empty', view); 
     if (!preventDestroy) { 
     this._destroyView(); 
     } 
     this.triggerMethod('empty', view); 

     // Remove region pointer to the currentView 
     delete this.currentView; 

     if (preventDestroy) { 
     this.$el.contents().detach(); 
     } 

     return this; 
    }, 

所以这里this.triggerMethod('before:empty', view);好像this是指以查看(A)和view指图(B)。这是打算?我认为这个方法会在视图(B)上触发?但是,我似乎也无法看到在视图(A)上触发的方法。

回答

1

thisthis.triggerMethod('before:empty', view);是指您的布局区域。你可以看到更多的区域生命周期事件/方法在这里:http://marionettejs.com/docs/v2.4.3/marionette.region.html#events-raised-on-the-region-during-show

如果您正在寻找方法来在您的视图中使用,onDestroyonBeforeDestroy是你正在寻找可能的东西。视图被“销毁”,区域被“清空”。 http://marionettejs.com/docs/v2.4.3/marionette.view.html#view-onbeforedestroy

相关问题