2013-03-24 2 views
1

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

// Child Array is Cards, trying to add computed observable for each child 
var CardViewModel = function (data) { 
    ko.mapping.fromJS(data, {}, this); 
    this.editing = ko.observable(false); 
}; 

var mapping = { 
    'cards': { // This never gets hit, UNLESS I remove the 'create' method below 
     create: function (options) { 
      debugger; 
      return new CardViewModel(options.data); 
     } 
    }, 

    create: function(options) { 
     var innerModel = ko.mapping.fromJS(options.data); 
     innerModel.cardCount = ko.computed(function() { 
      return innerModel.cards().length; 
     }); 
     return innerModel; 
    } 
}; 

var SetViewModel = ko.mapping.fromJS(setData, mapping); 
debugger; 
ko.applyBindings(SetViewModel); 

Однако я не могу получить «карты» обязательным для работы - этот код не будет достигнуто, если я не удалить метод «создать». Я пытаюсь следовать примеру с сайта выбывания:

http://knockoutjs.com/documentation/plugins-mapping.html

Они делают это для определения объекта ребенка:

var mapping = { 
    'children': { 
     create: function(options) { 
      return new myChildModel(options.data); 
     } 
    } 
} 
var viewModel = ko.mapping.fromJS(data, mapping); 

С ChildModel определенного так:

var myChildModel = function(data) { 
    ko.mapping.fromJS(data, {}, this); 

    this.nameLength = ko.computed(function() { 
     return this.name().length; 
    }, this); 
} 

Я провел прошлый день на этом и не могу для жизни меня понять, почему это не работает. Любые советы были бы удивительными.

EDIT: Вот скрипка того, с чем я работаю. Это только показывает СТОРОНА 1 в результате, потому что «редактирование» не признается здесь:

<div data-bind="visible: !$parent.editing()" class="span5 side-study-box"> 

http://jsfiddle.net/PTSkR/1/

Это ошибка я получаю в хроме, когда я запускаю его:

Uncaught Error: Unable to parse bindings. Message: TypeError: Object has no method 'editing'; Bindings value: visible: !$parent.editing()

+0

вы можете поставить скрипку так легко для нас? – DevelopmentIsMyPassion

+0

Просто добавил один, спасибо Ash – SB2055

ответ

2

Вы заменяете create поведение для вашей модели представления. Плагин сопоставления не будет вызывать никаких других обработчиков для ваших свойств. Поскольку вы выполняете сопоставление с помощью метода create, переместите обработчик cards.

var mapping = { 
    create: function(options) { 
     var innerModel = ko.mapping.fromJS(options.data, { 
      'cards': { 
       create: function (options) { 
        debugger; 
        return new CardViewModel(options.data); 
       } 
      } 
     }); 
     innerModel.cardCount = ko.computed(function() { 
      return innerModel.cards().length; 
     }); 
     return innerModel; 
    } 
}; 

updated fiddle

+0

Вау, спасибо Джефф. простое решение. Еще один вопрос, если вы не возражаете - с помощью метода cardCount я должен использовать innerModel.cards() или this.cards() ? – SB2055

+0

Ну, вы не сможете использовать 'this', потому что вы не перешли в свой' innerModel' как второй аргумент. Если да, то вы можете использовать 'this'. –

+0

очень круто. Еще раз спасибо за ваше время :) – SB2055

-1

вам не нужно было иметь скобки. Я только что изменил от

!$parent.editing() 

to 


!$parent.editing 

Смотрите обновленный скрипку here

+0

Просто обновил это, спасибо Ash ») – SB2055

+0

Было бы неправильно делать это изменение. Наблюдаемый« редактирование »никогда не создавался, поэтому попытка получить из него значение (путем его вызова) терпит неудачу. Ваше предложенное изменение изменяет логику с «видимого, если карта не редактируется», чтобы «видно, если редактирование наблюдаемого не определено», что неверно. –

+0

@JeffMercado да согласитесь. Спасибо за ваше объяснение. – DevelopmentIsMyPassion

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