我有一个木偶视图SingleCategoryView,它接受一个集合并呈现一个Collection视图的optionsView。
optionsView是itemView optionView的列表。
在我的SingleCategory视图中,我必须在Render上进行测试

 "onRender": function()
 {
   if(optionsView.hasOnlyExtraOption(optionsView.collection.models)) {
   var noResultsAvailableMsg =
   this.model.getLocalisationModel().getNoResultsAvailableMsg();

   var myModel = new noResultsAvailableModel({noResultsAvailableMsg:
   "noResultsAvailableMsg"});
   this.conflictMessageRegion.show(new noResultsAvailableView({ 'model' :
   myModel}))}
 }


这是位于optionsView文件中的hasOnlyExtraOptions的代码

"hasOnlyExtraOption": function(data) {
    return data.every(function(currentValue) {
        return
         currentValue.get(
         MODEL_VIEW_CONSTANTS.ctaDisplayConflicted.selectors.cfgExtraOptions
          ListItem) ||
           currentValue.get(
        MODEL_VIEW_CONSTANTS.ctaDisplayConflicted.properties.isExtraOption);
                });

            }


我的问题是,即使在渲染singleCategory时,我仍在进行测试,但尚未设置css类(isExtraOption cfgExtraOptionslistItem),因此测试结果不确定。
实际上,这些CSS类是由optionViewModel在此处设置的:

"onConfigurationStepsComplete": function() {
 // some code
  this.setIsExtraOption();
  //some code }


更明确的说:optionView作为optionsView的父级,witch具有singleCategoryView作为父级。我的目的是通过singleCategoryView的optionViewModel触发属性isExtraoption的更改。

先感谢您 。

最佳答案

您可以对集合视图和项目视图使用child event bubbling。即,一旦获取了配置,就会从子视图中触发方法,然后依次在父视图中执行代码。例如在子视图中:

// optionView
doSomething() {
   this.triggerMethod('did:something', this);
}


您可以在父视图中像这样收听:

 // optionsView
 onChildviewDidSomething(childView) {
    console.log('Something was done to ' + childView);
 }




上面的代码将传播事件,直到您使用的optionsView
然后,您可以使用普通的triggerlisten机制将其进一步传播。

例如,从optionsView触发另一个事件,例如:

// optionsView
onChildviewDidSomething(childView) {
    console.log('Something was done to ' + childView);
    this.triggerMethod('collectionview:did:something', this);
 }


您可以从父视图(在您的情况下为singleCategoryView)监听此事件,如下所示:

// singleCategoryView
this.optionsView.on('collectionview:did:something', this.handler);

关于javascript - 在父 View 中触发 subview 模型方法:MarionetteJs,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53042666/

10-08 21:49