如何将View Param传递给Kendo Mobile中的View Model DataSource?

时间:2014-02-12 19:29:52

标签: mobile kendo-ui param

将视图变量从URL传递到视图模型以过滤结果的正确方法是什么?

例如:

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函数。没有“视图”对象,所以我只是把它作为一个例子。

我尝试连接到“data-show”和“data-init”函数来设置要使用的值,但数据源在这些函数运行之前获取数据。

由于

2 个答案:

答案 0 :(得分:2)

配置选项options.transport.read可以是一个函数,因此您可以在那里撰写网址:

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' s change event

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

然后在viewModel.onListViewChange中,您可以为点击的项目设置相应的资源ID:

// 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本身的getter)。我不确定你的代码中所有这些都是如何构建的,因此很难给出更多建议;也许你可以添加一个链接到jsfiddle进行说明。

答案 1 :(得分:1)

您可以使用"全球"视图模型中的变量或字段用于此目的。像

这样的东西
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();
}

如果窗口小部件绑定到数据源,则数据源将在视图显示事件之前获取数据。您可以通过将窗口小部件autoBind配置选项设置为false来解决此问题 - 所有数据绑定的Kendo UI窗口小部件都支持它。