получить вложенные атрибуты в модели

На всю жизнь я не могу понять, как получить несколько атрибутов в моей модели.

Я определяю свою модель reportUrl следующим образом:

    var ReportUrl = Backbone.Model.extend({
        urlRoot: '/api/report/test/'
});

то, на мой взгляд, я получаю его вот так и добавляю в свою тестовую модель. Примечание. Он извлекает только один URL-адрес для каждого теста:

            var reportUrl = new ReportUrl({ id: test.id });
            reportUrl.fetch();
            test.set({
                reportUrl: reportUrl
            });
                var view = new reportUrlView({
                    model: test
                });

Если я его напишу, я увижу его в консоли браузера (см. скриншот ниже). Я просто не могу понять, как получить доступ к нужным мне данным.

Мне нужно получить атрибуты serverUrl и reportExt.

Поэтому я определяю this.reportUrl следующим образом: this.reportUrl = this.model.get('reportUrl');

if I do

console.log('this.reportUrl:', this.reportUrl); 

Я вижу этот экран: введите здесь описание изображения

Но я потерпел неудачу во всех своих попытках получить нужные мне атрибуты:

this.reportUrl.get('serverUrl') = undefined
this.reportUrl.serverUrl = undefined

this.model.attributes.reportUrl.get('serverUrl') = undefined
this.model.attributes.reportUrl.serverUrl = undefined
this.model.attributes.reportUrl.attributes.serverUrl = undfined

это единственная строка, которая что-то произвела:

this.model.attributes.reportUrl.attributes = id: xxxxxx ^^ the test.id above когда я позвонил в новый ReportUrl.

Так есть ли способ получить доступ к этим атрибутам?

Спасибо!


person SkyeBoniwell    schedule 15.02.2016    source источник
comment
Что такое this в вашем коде..? где это выполняется..? Что такое test..?   -  person T J    schedule 16.02.2016


Ответы (1)


Ваша основная проблема заключается в том, что fetch() выполняется асинхронно.

то, что вы видите в консоли, — это данные после завершения запроса, но ваш код выполняется раньше, поэтому возвращается undefined.

Ваш код должен быть

var reportUrl = new ReportUrl({ id: test.id });
reportUrl.fetch({
    success:function(model,response){
      test.set({
         reportUrl: model
      });
      var view = new reportUrlView({
         model: test
      });
   }
});

or

var reportUrl = new ReportUrl({ id: test.id });
reportUrl.fetch().then(function(){
  test.set({
     reportUrl: reportUrl
  });
  var view = new reportUrlView({
     model: test
  });
});

Не уверен, почему вы устанавливаете модель в другую - похоже, все, что вам нужно, это сделать test.fetch(), и ваш бэкенд должен вернуть объект reportUrl с требуемыми данными в ответ. Это будет намного чище.

в любом случае вы можете получить доступ к таким атрибутам, как this.model.get('reportUrl').get('serverUrl') , предполагая, что this указывает на ваше представление.

this.model.attributes.reportUrl.attributes.serverUrl, this.model.get('reportUrl').attributes.serverUrl, this.model.attributes.reportUrl.get('serverUrl') и т. д. также должны работать, но это не основной способ сделать это.

person T J    schedule 16.02.2016
comment
Благодарю. ReportUrl не является атрибутом «тестовой» модели, поэтому я добавил reportUrl в качестве атрибута теста. - person SkyeBoniwell; 16.02.2016