将视图变量从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”函数来设置要使用的值,但数据源在这些函数运行之前获取数据。
由于
答案 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窗口小部件都支持它。