2014-02-12 2 views
1

Каков правильный способ передачи переменной вида из URL-адреса в модель просмотра для фильтрации результата?Как пропустить View Param для просмотра модели DataSource в Kendo Mobile?

Например:

dataSource: new kendo.DataSource({ 
    transport: { 
     read: { 
      url: 'http://api.endpoint.com/resource', 
     } 
     parameterMap: function(options,type) { 
      if (type === 'read') { 
       return { 
        FormID: view.params.FormID 
       }; 
      } 
     } 

}); 

В приведенном выше примере, есть параметр в URL под названием «FormID», и я хотел бы передать это право значения функции parameterMap. Объект «view» отсутствует, поэтому я просто помещаю его в качестве примера.

Я попытался подключиться к функциям «data-show» и «data-init», чтобы установить это значение для использования, но источник данных извлекает данные до запуска этих функций.

Благодаря

+0

Любой прогресс здесь? Я хочу сделать то же самое, но скорее всего, привяжу его к концу URL-адреса, так что это что-то вроде «http://api.endpoint.com/resource/123» – 2GDave

+0

@ 2GDave звучит так, как будто вы хотите сделать transport.read функция, чтобы вы могли составить URL; Я не понимаю, откуда должно быть добавлено значение для добавления к URL-адресу. –

+0

Правильно, я хочу использовать переменную для создания URL-адреса конечной точки api, а затем установить источник данных для возвращаемых данных. Значение будет передано из исходного списка. В этом случае у меня есть список RSS-каналов, и когда вы нажимаете на фид, он загружает фид для этого фида. – 2GDave

ответ

1

Вы можете использовать «глобальные» переменные или поля в ViewModel для этой цели. Что-то вроде

var vm = kendo.observable({ 
    FormID: null, 
    dataSource: new kendo.DataSource({ 
    transport: { 
    read: { 
     url: 'http://api.endpoint.com/resource', 
    } 
    parameterMap: function(options,type) { 
     if (type === 'read') { 
      return { 
       FormID: vm.FormID 
      }; 
     } 
    } 
    }) 
}); 

function viewShow(e) { 
    vm.set("FormID", e.view.params.FormID); 
    // at this point it is usually a good idea to invoke the datasource read() method. 
    vm.dataSource.read(); 
} 

Источник данных будет извлекать данные перед представлением show view, если виджет связан с ним. Вы можете обойти эту проблему, установив параметр конфигурации виджета autoBind в false - все связанные с данными виджеты Kendo UI поддерживают его.

+0

В этом примере, как бы «ресурсов «знаете, что такое« FormID », если ресурс является конечной точкой api? Получается ли это как какой-то параметр запроса? – 2GDave

+0

FormID передается как параметр строки запроса в представление, в котором размещен виджет, связанный с данным источником данных. Функция viewShow - это обратный вызов, связанный с событием show view, например, @AndreLiem. Дополнительная информация о параметрах вида: http: //docs.telerik.com/kendo-ui/get-started/mobile/view # view-parameters –

+0

Большое спасибо за помощь от вас, ребята. Если бы я мог разделить 50 бонусов между обоими, я бы это сделал, но я не мог, поэтому я получил его на основе AUTOBIND, связанный с viewShow, поскольку это было отчасти ключом для меня, поскольку я не получал viewparm, поскольку он был обязательным слишком рано. Еще раз спасибо! – 2GDave

2

Конфигурация Опция options.transport.read может быть функцией, так что вы можете составить URL там:

dataSource: new kendo.DataSource({ 
    transport: { 
     read: function (options) { 
      // get the id from wherever it is stored (e.g. your list view) 
      var resourceId = getResourceId(); 

      $.ajax({ 
       url: 'http://api.endpoint.com/resource/' + resourceId, 
       dataType: "jsonp", 
       success: function (result) { 
        options.success(result); 
       }, 
       error: function (result) { 
        options.error(result); 
       } 
      }); 
     } 
    } 
}); 

Для подключения этого с списка, вы можете использовать управления ListView change event:

data-bind="source: pnrfeedsDataSource, events: { change: onListViewChange }" 

затем в viewModel.onListViewChange вы можете установить соответствующий идентификатор ресурса для элемента, на который было нажато:

// the view model you bind the list view to 
var viewModel = kendo.observable({ 
    // ..., your other properties 
    onListViewChange: function (e) { 
     var element = e.sender.select(); // clicked list element 
     var uid = $(element).data("uid"); 
     var dataItem = this.dataSource.getByUid(uid); 

     // assuming your data item in the data source has the id 
     // in dataItem.ResourceId 
     this._selectedResource = dataItem.ResourceId; 
    } 
}); 

Тогда getResourceId() может получить его от viewModel._selectedResource (или это может быть геттер на viewModel). Я не уверен, как все это структурировано в вашем коде, поэтому трудно дать больше советов; возможно, вы можете добавить ссылку на jsfiddle для иллюстрации.

+0

Итак, как бы выглядеть getResourceId()? Будет ли эта функция иметь доступ к представлению, чтобы я мог получить парфюмы просмотра? Я думаю, что это то, что я ищу, но теперь я не уверен в том, чтобы включить resourceId в эту функцию. Есть предположения? – 2GDave

+0

см. В разделе edit (если это не сработает, это поможет узнать больше о том, как это структурировано, например, как DS относится к модели представления) –

+0

Спасибо, я новичок в Kendo и мобильном интерфейсе, поэтому помощь очень ценится. Я сделаю это и дам вам знать, как это происходит. – 2GDave