Получение объекта данных с использованием имени представления или имени заполнителя

Я использую jsView (v1.0.0-альфа)

У меня возникла проблема с получением данных из представления. Пусть у меня есть следующий код. (здесь я создал упрощенную версию http://jsfiddle.net/j5oc0svg/). Я пытаюсь получить объект данных, который я привязывал к представлению ранее, используя имя заполнителя. Он всегда возвращается «недооцененным». Если я вызову $.view().views, то смогу увидеть представление и данные, которые я привязал ранее.

Как я могу получить данные, привязанные к представлению, используя заполнитель или (имя представления?)?

Заранее спасибо.

<!DOCTYPE html>        
<html>
<head>
  <script src="http://code.jquery.com/jquery.js"></script>
  <base href="http://www.jsviews.com/samples/"/>
  <link href="samples.css" rel="stylesheet"/>
  <script src="../download/jsviews.js"></script>
</head>
<body>

<table><tbody id="peopleList"></tbody></table>

<script id="personTmpl" type="text/x-jsrender">
  <tr>
    <td>Name</td>
    <td>{{:name}}</td>
  </tr>
</script>

<script>

           $.ajax({
                url: "http://localhost:4728/api/People/,
                dataType: 'json'
            }).done(function (data) {
                if (data!= null) {
                    var template = $.templates("#personTmpl");
                    template.link("#peopleList", data);
                }
            }).fail(function (exception) {
                console.log(exception.message);
            });


           // Let's say this code is in button on click or push subscriber 
           hub_proxy.client.UpdateSomething = function (someArgs) {
                  var data = $.view('#peopleList').data; //underfined.
           }

</script>

</body>
</html>

person Michael Sync    schedule 07.09.2014    source источник
comment
У вас нет атрибутов данных, поэтому свойство данных не определено?   -  person adeneo    schedule 07.09.2014
comment
нет.. если вы посмотрите на эту ссылку (jsviews.com/#jsvplaying), она имеет код такой. $(#peopleList).on(click, .changeBtn, function() { var dataItem = $.view(this).data; $.observable(dataItem).setProperty(name, dataItem.name + counter++); }). $.view(this.data) работает без атрибута данных.   -  person Michael Sync    schedule 07.09.2014


Ответы (2)


Вы, кажется, упускаете из виду тот факт, что Views в jsView являются (своего рода) композитами: другими словами, каждый объект View может содержать набор внутренних представлений, среди прочего.

С помощью $.view(selector) вы получаете самое внешнее представление, содержащее элемент selector. Для #peopleList это просто контейнер для других представлений без собственных данных. Что вы, вероятно, ищете в этом случае, так это найти самый внутренний вид, все еще имеющий #peopleList в области видимости: это делается с установкой параметра inner для $.view() на true:

console.log( $.view('#peopleList', true) ); // Array of Objects

В качестве альтернативы вы можете просто перейти к определенному объекту данных для каждой строки:

console.log( $.view('#peopleList tr:eq(0)').data ); // Object {name: "Adriana"} 
console.log( $.view('#peopleList tr:eq(1)').data ); // Object {name: "Robert"}

Демо. Я использовал здесь селектор :eq только для иллюстрации; но вы всегда можете назначить имя представлению, а затем обратиться к нему в селекторе.

person raina77ow    schedule 07.09.2014
comment
Спасибо! На самом деле, мне нравится получать объект «люди», который я связываю. Не отдельный объект. Если вы посмотрите на $.view().views(console.log($.view('#peopleList').views);), то увидите объект "люди". Это объект, который мне нравится получать. не отдельные строки. - person Michael Sync; 07.09.2014
comment
Да, и я учел это в своем обновлении. Кстати, вы проверили исходный код этой библиотеки? Похоже, большая часть документации находится внутри. ) - person raina77ow; 07.09.2014
comment
Большой! Большое спасибо! Код тоже проверю. :) Спасибо еще раз. - person Michael Sync; 07.09.2014

Да, ответ от raina77ow - хороший ответ.

Еще пара способов получить конкретные данные, например. для этого случая, когда вы хотите получить массив, который вы передали в link() в первую очередь:

// Get the nearest ancestor view for an array, and hence the data
var arr = $.view('#peopleList tr').get("array").data;

// Get the top-level view created by the link view or render call (In this case, this is the "array" view)
var arr = $.view('#peopleList tr').get().data;

// Get the top-level data that was passed to the link or render method (In this case, also the array)
var arr = $.view('#peopleList tr').ctx.root;

Я разветвил демонстрацию raina77ow и добавил эти альтернативы: http://jsfiddle.net/BorisMoore/p9mfmb3r/

Кстати, просмотр модульных тестов также может быть хорошим источником идей:

https://github.com/BorisMoore/jsviews/tree/master/test/unit-tests

person BorisMoore    schedule 07.09.2014
comment
Спасибо Борис! Зачем нам нужно использовать 'view('#peopleList tr')' (с tr) или '$.view('#peopleList', true)'? Почему мы не можем просто использовать '$.view('#peopleList').data' в моем случае? Не могли бы вы рассказать о технической причине отсутствия поддержки «$.view('#peopleList').data'? Спасибо! - person Michael Sync; 08.09.2014
comment
Представление — это экземпляр отображаемого шаблона. $.view(someElemOrSelector) получает представление, отображающее этот элемент. См. jsviews.com/#jsobservable. Элемент #peopleList не был обработан вашим шаблоном/данными, поэтому его представление является представлением верхнего уровня, не связанным с вашими данными. Для визуализированных представлений либо выберите элемент, который был визуализирован вашим шаблоном, чтобы найти представление элемента, которое его визуализировало (или представление массива — родитель для двух представлений элементов), либо вызовите '$.view('#peopleList', true) чтобы найти первое «внутреннее» представление, связанное с содержимым элемента #peopleList. - person BorisMoore; 08.09.2014
comment
Я понимаю. Отмечено. Тогда поведение немного отличается от шаблона данных WPF/Sivlerlight. В SL (например, michaelsync.net/2011/12/22/), мы можем получить данные из элемента управления, который мы привязываем. (например, ‹ItemsControl ItemsSource={Binding People}), но да, я вас понял. В JSView привязка аналогична добавлению элемента в заполнитель. Спасибо за объяснение! Действительно оценил это! - person Michael Sync; 08.09.2014