2013-08-04 1 views
0

У меня есть форму с множеством вопросов. В каждом вопросе есть несколько ответов. На уровне формы я хотел бы создать несколько вычисленных наблюдаемых данных, таких как общий балл и количество вопросов. Форммодель, вопросымодели и андермодель создаются таким же образом. Вопросительная модель «знает» ответы. Это позволяет мне создавать рассчитанные наблюдаемые числа, такие как количество ответов или максимальных точек.Вычислительные наблюдаемые в вложенных массивах с картографическим плагином

Моя проблема - это модель формы, которая не распознает массив вопросов. Я могу подсчитать количество ответов в каждом вопросе, но не количество вопросов в форме. Что-то не так с моими моделями или я должен исследовать свои данные?

function formViewModel(data) { 
     var self = this; 
     var mapping = { 
      'questions': { 
       create: function (options) { 
        return new questionsViewModel(options.data); 
       } 
      } 
     };   
     var model = ko.mapping.fromJSON(data, mapping, self); 
     model.numberOfQuestions = ko.computed(function() { 
      return self.questions().length; // error: self.questions() is not a function 
     }); 
     return model; 
    } 

    function questionsViewModel(data) { 
     var self = this; 
     var mapping = { 
      'answers': { 
       create: function (options) { 
        return new answersViewModel(options.data); 
       } 
      } 
     }; 
     var model = ko.mapping.fromJS(data, mapping, self); 
     model.numberOfAnswers = ko.computed(function() { 
      return self.answers().length; // no problem 
     }); 
     return model; 
    } 

    function answersViewModel(data) { 
     var self = this; 
     var mapping = {}; 
     var model = ko.mapping.fromJS(data, mapping, self); 
     return model; 
    } 

ответ

0

Я думаю, что вы пытаетесь получить длину вопросов, прежде чем он полностью экземпляр - вы можете попытаться изменить ваш вычислен к следующему -

model.numberOfQuestions = ko.computed(function() { 
    if (!self.questions()) {return 0;} 
    return self.questions().length; // error: self.questions() is not a function 
}); 

, но и, похоже, вы можете имеют некоторые проблемы с охватом -

function formViewModel(data) { 
    var self = this; 
    self.mapping = { 
     // do stuff 
    }; 
} 

Ознакомьтесь с этим ответом для получения дополнительной информации о правильном создании области видимости в вложенной карте. Бьюсь об заклад, если вы console.log (self) перед вашим self.questions(). Length это не то, что вы ищете, или это еще не по крайней мере.

Map JSON data to Knockout observableArray with specific view model type

+0

Благодарим за ваши предложения. Однако это не решило мою проблему: Проверка на self.questions() все еще дала ту же ошибку: «questions() не является функцией». Изменение функции "formViewModel (данные) {" в "var formViewModel = функция (данные) {" ничего не сделала. Я получаю все свои данные в одном вызове Ajax. Поэтому formViewModel использует ko.mapping.fromJSON. В вопросеModel используется ko.mappingfromJS. Кажется, что эти функции не эквивалентны ... – Jeroen

+0

Console.log the self and see the scope is the point point –

+0

Вы были правы! Это проблема масштаба. Я должен был: return self.formulier.questions(). Length; («formulier» - это имя первого или корневого элемента моей строки JSON) Wonderfull. Большое спасибо! – Jeroen