2013-02-08 1 views
1

Я сделал решение для одностраничного приложения, которое будет использоваться для отображения большого экрана в здании завода, отображающего информацию о состоянии и показатели производительности для набора машин. Через файл настроек, который получается через вызов ajax, приложение знает, какие машины должны отображаться. Таким образом, для каждой машины шаблон, а для каждой информации о машине создается вложенный шаблон (koExternaltemplateengine). Также первый вызов ajax содержит URL-адреса для вызовов ajax для всех машин. Ответы на эти вызовы содержат конкретные для машины значения. Эти вызовы повторяются периодически, и отображаемые значения обновляются. Все привязки выполняются с нокаутом и плагином для сопоставления, чтобы избежать жесткого кодирования viewmodel clientside. Рамка и контейнеры (панели) машины привязаны к данным первого вызова, поля данных вложенных шаблонов привязаны к атрибутам данных, содержащимся в ответном ответе ajax вызовов машины.Условное связывание с knockout.js/mapping plugin/koExternal engine engine/json from ajax

Теперь моя проблема: если все ajax-вызовы для всех машин доставляют требуемые данные для отображения, все работает нормально. НО: Для некоторых машин иногда (также при начальной загрузке) вызовы успешны (200), но содержат только нуль (в этот момент данные недоступны). Теперь у меня проблема. После ko.applybindings (machinedata, machinediv) я получил «Невозможно выполнить синтаксические привязки». для полей связанных значений и ko завершает привязку. Таким образом, дисплей не отображается полностью и никаких обновлений не запускается.

Теперь я попробую что-то с привязками if/ifnot, но что произойдет, если после обновления начальные не связанные значения присутствуют? (ручная привязка для повторного использования, дополнительная для ko.mapping.fromJS ??).

У кого-то была аналогичная проблема? Какие-либо предложения? Как я уже говорил, я хочу избегать жестко настроенных режимов просмотра, чтобы облегчить будущие расширения для большего количества атрибутов машины.

ответ

0

Вы можете хранить machinedata в наблюдаемой:

Ваше мнение:

<div data-bind="if: machinedata()> 
    <div data-bind="with: machinedata()"> 
     ... 
    </div> 
</div> 
<div data-bind="if: machinedata()> 
    Data could not be loaded.... 
</div> 

Вид модели:

var ViewModel = function() { 
    var self = this; 

    self.machinedata = ko.observable(); 

    self.update = function() { 
     var data = someAjaxCall(); // returns the data or any falsy value 
     self.machinedata(data); 
    }; 
} 

var viewModel = new ViewModel(); 
ko.applyBinding(viewModel); // data does not yet exist 
viewModel.update(); 

Пока вы только связала загруженные данные и не нужны какие-либо вычисления, вам даже не понадобится ko.mapping.

+0

Звуки применимы. Thx, delixfe! Я попробую что-то вроде этого. – TH1976

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

  • Нет связанных вопросов^_^