Backbone.js将url参数传递给集合

时间:2012-08-14 01:27:59

标签: javascript backbone.js

我正在使用一个测试.json文件,并且可以在控制台上成功记录网址,但是我现在尝试将参数附加到网址并忽略它们。

这是视图的样子,工作正常,成功消息与测试json文件一起出现:

busImportSearch: function() {
    importSelect.fetch({
        data: {
            importPhone: '5555555555',
            busImportName: 'test business',
            busImportCID: '12345',
            busImportBID: '1234567890'
        },
        success: function(results) {
            // url console.log's fine just no params
        }
    });
}

这就是我在集合中所拥有的:

var importSelect = Backbone.Collection.extend({
    model: importModel,

    url:'somepath/test.json',

    sync: function(method, model, options) {
        options.timeout = 10000;
    options.dataType = "json";
        return Backbone.sync(method, model, options);
    },

    parse: function(response) {
        console.log(this.url);
        if (typeof response.data !== 'undefined') {
            this.result = response.data.list;
         }
        return this.result;
     },
});

 return new importSelect;
});

修改

我认为这是有效的,但我认为有更好的方法:

url: function() {
  var busimportPhone = $("#busImportPhone").val();
  var busImportName = $("#busImportName").val();
  var busImportCID = $("#busImportCID").val();
  var busImportBID = $("#busImportBID").val(); 
  var updateUrl = 'test.json' + '?importPhone=' + busimportPhone + '&importName=' + busImportName + '&importCID=' + busImportCID + '&importBID' + busImportBID; return updateUrl;
},

2 个答案:

答案 0 :(得分:2)

这不是更好,但您可以将集合中的属性列表存储在某处,并从那里创建URL。例如

importSelect.myDataList = {
        importPhone: '5555555555',
        busImportName: 'test business',
        busImportCID: '12345',
        busImportBID: '1234567890'
    };
importSelect.fetch({ ... });

使用类似(代码未测试)

之类的函数构建您的网址
function constructUrl(data) {
    var result = "";
    var count = 0;
    for(var i in data) {
       var prefix = "&";
       if(count == 0) {
           prefix = "?";
       }
       result += prefix + i + "=" + data[i];
    }
    return result;
}

并使用函数创建Url

...
url: function() { 
    return constructUrl(this.data);
}
希望有所帮助。

答案 1 :(得分:0)

我认为您通过定义url函数走在正确的道路上,只需从您的集合中获取这些查询参数,而不是直接从您的页面中获取。该集合应该能够知道加载了哪种项目,因此以某种方式将查询参数与集合实例一起存储是有意义的。在过去,我在Collection定义中使用了一个对象。但是要小心,否则你最终会得到一个由所有这些集合实例共享的对象。

Side注意:我之前一直在试图设置,以便对于可以通过各种查询参数查询生成的任何集合,将存在仅建模查询参数的关联模型。通过模型和集合之间的事件绑定,更改模型的值然后可以自动触发集合中的提取。但这是一个合理的触发器吗?我不确定。