2015-09-16 14 views
0

У меня возникла проблема с обновлением шаблона JSViews при изменении базовых данных. Он включает в себя диапазон, связанный с данными, используя функцию конвертера для базовых данных. Когда базовые данные изменяются после асинхронного вызова на сервер, текст диапазона не обновляется.Шаблон JSViews не обновляется при изменении базовых данных

Markup:

{^{for thedata.myarrayobject}} 
    <span data-link="{myconverter:var1:} name{:'theName' + var2}"></span> 
{{/for}} 

Сценарий:

$.views.converters({ 
    myconverter: function (val) { 
     switch (val) { 
      case 1: 
       return 'Test1'; 
       break; 
      case 2: 
       return 'Test2'; 
       break; 
      default: 
       return 'Default'; 
     } 
    } 
}); 

Пролет правильно отображает на странице загрузки на основе значений в thedata.myarrayobject. Например. если мы имеем:

thedata.myarrayobject[0].var1='1'; 
thedata.myarrayobject[0].var2='John'; 
thedata.myarrayobject[1].var1='2'; 
thedata.myarrayobject[1].var2='Matthew'; 

будет загружаться:

<span name="theNameJohn">Test1</span> 
<span name="theNameMatthew">Test2</span> 

Однако, если лежащие в основе изменений данных после асинхронным обратного вызова:

thedata.myarrayobject[0].var1='2'; 
thedata.myarrayobject[0].var2='John'; 
thedata.myarrayobject[1].var1='1'; 
thedata.myarrayobject[1].var2='Matthew'; 

текст пядь просто остаются на том одна и та же.

Я отлаживал код js, а параметр базового массива 'var1' определенно устанавливается в новое значение. Я пробовал позвонить:

$.observable(thedata.myarrayobject).refresh(thedata.myarrayobject); 

, но безрезультатно.

Я, очевидно, хочу, чтобы текст диапазона корректировался, поскольку основные изменения данных - любая помощь будет принята с благодарностью!

+1

Можете ли вы показать свой код, как вы изначально ссылаетесь на данные, а затем на свой код для обновления к новым данным. В идеале jsfiddle - с кнопкой, вызывающей текущий код для обновления к новым данным? Тогда я посмотрю ... – BorisMoore

+0

Привет @BorisMoore - чтобы ответить на ваш вопрос, я использую метод link(), поэтому ссылки на данные должны работать ... но ваш второй вопрос о том, как я обновляю данные указал мне в правильном направлении. Я делаю это, как указано выше: прямое обновление значений параметров в js. Я просто попробовал это в наблюдаемой обертке - и это сработало! Я опубликую его ниже. Есть ли какой-то способ, которым я могу дать вам кредит на это - я сомневаюсь, что я бы сделал это без вашего комментария! – Marco

+0

Я добавил ответ, чтобы показать некоторые альтернативные способы объединить данные «наблюдаемо». – BorisMoore

ответ

2

На самом деле, чтобы сделать обновление, вам нужно выбрать свою собственную стратегию для объединения новых данных (например, от вызова Ajax) с предыдущими данными.

Но любое слияние должно выполняться с использованием «наблюдаемых» API - чтобы JsViews получал уведомления об обновлении данных и обновлял ваш пользовательский интерфейс.

Поэтому в зависимости от ваших данных и сценарии, вы можете использовать любой из следующих видов обновления:

  1. Изменение листьев ценит один на один раз:

    $.observable(thedata.myarrayobject[0]).setProperty("var1", "2");

  2. Изменить листовые значения по одному объекту за один раз:

    $.observable(thedata.myarrayobject[0]).setProperty(newarrayobject[0]);

    (Это будет забрать все измененные свойства)

  3. Обновить весь массив с новыми объектами:

    $.observable(thedata.myarrayobject).refresh(newarrayobject);

    (Это будет копировать новые объекты/предметы более в myarrayobject)

  4. Обновление myarrayobject с новым:

    $.observable(thedata).setProperty("myarrayobject", newarrayobject);

    Так вот вы заменяете массив с новым ...

Любой или каждый из указанных выше будут запускать обновления с новыми значениями данных.

Обратите внимание, что описанные выше методы предполагают, что вы загрузили новый массив данных, newarrayobject, который содержит обновленные данные для объединения в ваш предыдущий myarrayobject. Вам не нужно клонировать либо newarrayobject, либо предыдущий myarrayobject.

1

Ну после того, как BorisMoore выше задал пару вопросов ... То, как я обновляя данные - просто нажав на нее направить в параметры массива, как описано выше:

thedata.myarrayobject[0].var1='2'; 
thedata.myarrayobject[0].var2='John'; 
thedata.myarrayobject[1].var1='1'; 
thedata.myarrayobject[1].var2='Matthew'; 

не работал, и мой призыв к $ .observable (...). refresh (...) не работает, потому что я проходил один и тот же массив: никаких изменений не было сделано для обновления разметки.

Просто, я скопировал массив в новом, обновили значение, то называется обновление, которая работает:

var myduparrayobject = thedata.myarrayobject.splice(); 

myduparrayobject [0].var1='2'; 
myduparrayobject [0].var2='John'; 
myduparrayobject [1].var1='1'; 
myduparrayobject [1].var2='Matthew'; 

$.observable(thedata.myarrayobject).refresh(myduparrayobject); 

Рассмотрены вопросы:

  1. только наблюдаемые изменения в массив будет обновляться до разметки. Не просто обновление данных объекта, как я думал.

  2. $ .observable (...). Refresh (...) работает только тогда, когда передается измененный массив на указанный объект. Передача того же ссылочного объекта, что и я (даже если он отличается от того, что отображается в разметке) не приведет к изменениям в разметке шаблона.