我有一个木偶视图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
。然后,您可以使用普通的trigger和listen机制将其进一步传播。
例如,从
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/