Привязка вложенных шаблонов в KnockoutJS

Хорошо, прежде чем я покажу свой код и свой подход, позвольте мне объяснить, в чем проблема, возможно, у кого-то есть лучшее решение. Дело в том, что у меня есть список массивов, сгруппированных по определенным критериям. Мне нужно отобразить список/раздел по критериям, и каждый раздел содержит список объектов, которые также должны отображаться как HTML.

Я новичок в KnockoutJS - я начал использовать его вчера. Но, учитывая проблему, я искал в документах наблюдаемый словарь или что-то подобное. К счастью, я нашел плагин ko.observableDictionary. Поэтому я подумал, что это должно сработать, и написал следующий код (просто доказательство концепции):

<div id="tiles-holder" data-bind="template: { name: 'tile-list', foreach: dictionary }">

</div>

<script type="text/html" id="tile-list">
<div class="md-auto-max-width">
    <div class="md-list-tiles md-auto-arrange-tiles" data-bind="template: { name: 'tile-default', foreach: items }"></div>
</div>
</script>

<script type="text/html" id="tile-default">
    <div class="metro-tile-square  md-list-item md-list-tile-large">
        <div class="md-list-item-image" data-bind="css: { defaultimage: $data.title() != 'architect' }"></div>

        <div>
            <span data-bind="text: name"></span> - <span data-bind="text: $data.department"></span>
        </div>

    </div>
</script>

<script type="text/javascript" src="@Url.Content("~/Scripts/metro/ko.observableDictionary.js")"></script>
<script type="text/javascript">

    $(function () {
        var viewModel = function TileViewModel() {
            var self = this;

            self.dictionary = new ko.observableDictionary();

            for (var i = 0; i < 15; i++) {
                self.dictionary.push("Developers", new employee('developer' + i, 'developer', 'projectDevelopment'));
                self.dictionary.push("Analysts", new employee('analyst' + i, 'analyst', 'business intelligence'));
            }
            self.dictionary.push("Architects",new employee('Some Architect', 'architect', 'Architecture and development'));



            function employee(name, title, department) {
                this.name = ko.observable(name);
                this.title = ko.observable(title);
                this.department = ko.observable(department);
            }
        };

        ko.applyBindings(new viewModel(), $('#tiles-holder').get(0));
    });
</script>

Но я продолжаю получать следующую ошибку:

Ошибка: невозможно проанализировать привязки. Сообщение: TypeError: $data.title не является функцией; Значение привязки: css: { defaultimage: $data.title() != 'архитектор'}

Я считаю, что проблема в том, что $data не относится к контексту данных шаблона. Но как мне это решить?


person Kassem    schedule 14.08.2012    source источник


Ответы (1)


Зачем использовать словарь в первую очередь, вы не используете его как словарь, поэтому вместо этого используйте observableArray

в любом случае, вам нужно получить доступ к значению каждого элемента

http://jsfiddle.net/X2xZM/

person Anders    schedule 14.08.2012