2013-06-11 2 views
1

Я хочу пропустить наблюдаемый массив объектов, и в этом цикле я должен получить соответствующее значение другого наблюдаемого массива. Мне это не удается.KnockoutJs: прямой адрес наблюдаемого объекта Array in view

Мой код выглядит следующим образом.

Модель и ViewModel:

//**********MODEL******************** 
function Configuration() { 
var self = this; 

self.properties = ko.observableArray(); 
} 

function deviceProperty() { 
    var self = this; 

    self.property = ko.observable(""); 
    self.value = ko.observable(""); 
} 

//**********VIEWMODEL**************** 
function compareModelView() { 
var self = this; 

self.config1 = ko.observable(new Configuration); 
self.config2 = ko.observable(new Configuration); 

$().ready(function() { 
    //Load config1 and config2 
}); 

} 

//**********jQuery******************** 
(function ($) { 
    $(document).ready(function() { 
     ko.applyBindings(new compareModelView()); 
    }); 
})(jQuery); 

Вид:

<!-- ko foreach: config1().properties --> 
    <tr> 
    <td data-bind="text: property()"></td> 
    <td data-bind="text: value()"></td> 
    <td data-bind="text: $root.config2().properties()[$index].value()"></td> 
    </tr> 
<!-- /ko --> 

Knockoutjs выдает ошибку, говоря, что это свойство не существует.

Когда я делаю $root.config2().properties().length, он возвращает число (3). Когда я делаю $root.config2().properties()[0], он возвращает [Object] [Object]. Когда я делаю $root.config2().properties()[0], он возвращает пустую строку.

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

+0

Почему вы хотите сделать это? Представление должно быть чистым от кода – Anders

+0

@Anders Поскольку у меня есть эта модель, и я хочу создать экран сравнения между различными конфигурациями. – JurgenStillaert

+1

Но его больше MVVM переместить код в viewmdodel. Это все, что я говорю. – Anders

ответ

1

$index является наблюдаемым объектом (см. doc), поэтому вам нужно написать $index(), чтобы получить его значение.

Так следующее связывание должно работать:

<td data-bind="text: $root.config2().properties()[$index()].value()"></td> 

Хотя ваша главная проблема была $index(), но сам по себе это не решит ваше дело, потому что порядок населения коллекций имеет значения в этом сценарии, так что вы получите ошибки с вашей текущей настройкой.

Итак, если вы заселяете сначала config1() KO начинает связывать вашу таблицу, но если config2() еще не заполнен, вы получите некоторые неопределенные ошибки. Чтобы исправить это, вам нужно изменить порядок народонаселения, чтобы сначала заполнить config2().

Вы можете поиграть с этим здесь: http://jsfiddle.net/xwjKK просто измените порядок pupulateConfig2 и pupulateConfig1 позвоните, чтобы увидеть эффект.

+0

'$ root.config2(). Properties() [$ index()]. ​​Value()' дает 'Message: TypeError: $ root.config2 (...). Properties (...) [$ index (. ..)] не определено; '. Howerver '$ root.config2(). Properties() [$ index()]' дает '[object Object]'. Так что правильно для $ index(), но все равно не может обратиться к свойству value. – JurgenStillaert

+1

'$ root.config2(). Properties() [$ index()]. ​​Значение()' должно работать, но если вы сначала заполняете 'config1()' KO начинает заполнять вашу таблицу, но если 'config2() 'еще не заполнен, вы получаете сообщение undefined. Поэтому вам нужно сначала заполнить 'config2'. Вы можете играть с этим здесь: http://jsfiddle.net/xwjKK/ просто измените порядок 'pupulateConfig2' и' pupulateConfig1', чтобы увидеть эффект. – nemesv

+1

Если вы не хотите/не можете изменить порядок народонаселения, вы можете добавить некоторую проверку индекса с помощью 'with' bindindg: http://jsfiddle.net/xwjKK/1/ – nemesv

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