Запустить метод модели дочернего представления в родительском представлении: MarionetteJs - PullRequest
0 голосов
/ 29 октября 2018

У меня есть представление марионеток SingleCategoryView, которое принимает коллекцию и отображает параметры просмотра. optionsView представляет собой список optionView itemView. В моем представлении 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}))} 
 }

вот код hasOnlyExtraOptions, расположенный в файле optionsView

"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, а в качестве родительского - singleCategoryView. Моя цель - вызвать изменение атрибута isExtraoption с помощью optionViewModel из singleCategoryView.

Спасибо заранее.

1 Ответ

0 голосов
/ 29 октября 2018

Вы можете использовать всплывающее сообщение дочернего события для представления коллекции и представления элемента. то есть вызвать метод из дочернего представления после выборки конфигурации и выполнить код в родительском представлении по очереди. например, в детском представлении:

// 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);
...