在父视图中触发子视图模型方法:MarionetteJs
Trigger a child view model method in the parent view : MarionetteJs
我有一个 Marionette 视图 SingleCategoryView,它接受一个集合并呈现一个集合视图 optionsView。
optionsView 是一个itemView optionView 的列表。
在我的 SingleCategory 视图中,我必须对渲染进行测试
"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 class ( isExtraOption cfgExtraOptionslistItem ) 尚未设置,因此测试结果未定义。
实际上这些 css class 是由此处的 optionViewModel 设置的:
"onConfigurationStepsComplete": function() {
// some code
this.setIsExtraOption();
//some code }
更明确地说:optionView 有父 optionsView, 有 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 and 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);
我有一个 Marionette 视图 SingleCategoryView,它接受一个集合并呈现一个集合视图 optionsView。 optionsView 是一个itemView optionView 的列表。 在我的 SingleCategory 视图中,我必须对渲染进行测试
"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 class ( isExtraOption cfgExtraOptionslistItem ) 尚未设置,因此测试结果未定义。 实际上这些 css class 是由此处的 optionViewModel 设置的:
"onConfigurationStepsComplete": function() {
// some code
this.setIsExtraOption();
//some code }
更明确地说:optionView 有父 optionsView, 有 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 and 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);