2014-10-03 2 views
0

пожалуйста, перейдите по ссылке: http://jsfiddle.net/nn0mfe48/1/Нокаут: как я могу передать модель в литерал объекта javascript?

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

работы:

var profileModel = { 
    first: ko.observable("Bob"), 
    last: ko.observable("Smith"), 
}; 

не работает:

var profileModel = function() { 
    this.firstname= ko.observable("Bob"); 
    last: ko.observable("Smith"); 
}; 

то, что мне нужно изменить в коде, чтобы заставить его работать. Мне нужно время, чтобы передать объект viewmodel с нокаутом в viewmodel и привязать значение динамически вместо жесткого кодирования значений.

я прошел по ссылке: Difference between knockout View Models declared as object literals vs functions

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

+0

Javascript 101 ... это не имеет никакого отношения к нокауту. Сначала изучите синтаксис javascript. –

ответ

2

Код в вашем вопросе: вы смешиваете синтаксис объектного литерала с синтаксисом присваивания переменных. Кроме того, в функции вы должны назначать this переменной self/that, чтобы облегчить проблемы с областью. Это также делает использование ko.computed() намного приятнее.

var profileMod = function() { 
    var self = this; 
    self.first = ko.observable("Bob"); 
    self.last = ko.observable("Smith"); 
    } 

Я обновил свой скрипку http://jsfiddle.net/nn0mfe48/3/

+0

Спасибо, Стивен, это сработало. :), но получение ошибки в консоли вроде: referenceError: невозможно обработать привязку "с помощью функции function() {return shell}" Сообщение: невозможно обработать привязку "с помощью функции function() {return $ root.profile}". Даже после этой ошибки он связывает данные. – ravibhat

+0

Это потому, что я оставил выбранный выбор в своем определении. http://jsfiddle.net/nn0mfe48/4/ – Stephen

+0

Я, получил его после ответа на пост. спасибо помощнику, оцените ваш немедленный ответ. – ravibhat

1

После того как вы создали ваш взгляд модель правильно:

var profileModel = function() { 
    this.firstname = ko.observable("Bob"); 
    this.lastname = ko.observable("Smith"); 
}; 

Убедитесь, что вы создаете новый экземпляр его перед переплетом:

var vm = new profileModel(); 

И свяжите что:

ko.applyBindings(vm); 

Кроме того, будьте осторожны с использованием with связывания. Вы создали контекст вокруг своей модели shell, которая заставляет вас использовать $root для доступа к вашей модели profile.

+0

Спасибо, помощник. :) – ravibhat

+0

Добро пожаловать. Разумеется, хотя все ваши модели должны быть построены таким образом, а не как литералы объектов. Вы можете составить или объединить все модели, которые вы хотите, но они должны быть определены последовательно. И если вы хотите, чтобы события пузырялись, вы можете также переносить экземпляры других моделей в 'ko.observable' (например,' this.profile = ko.observable (new profileModel()); '). –

Смежные вопросы