Javascript 主干的击退视图模型。集合不';似乎无法创建kb.CollectionObservable

Javascript 主干的击退视图模型。集合不';似乎无法创建kb.CollectionObservable,javascript,backbone.js,viewmodel,Javascript,Backbone.js,Viewmodel,以下面的代码为例: var model = new Backbone.Model({ items: new Backbone.Collection([ new Backbone.Model({ ID: 1 }), new Backbone.Model({ ID: 2 }) ]) }); var vm = new kb.ViewModel(model) 根据击退API所说的(即:),我希望“vm.items”是一个kb.Colle

以下面的代码为例:

var model = new Backbone.Model({
    items: new Backbone.Collection([
        new Backbone.Model({ ID: 1 }),
        new Backbone.Model({ ID: 2 })        
    ])
});

var vm = new kb.ViewModel(model)
根据击退API所说的(即:),我希望“vm.items”是一个kb.CollectionObservable

但是,当我尝试使用kb.CollectionObservable函数“filter”和“comparator”将排序和筛选函数属性化为collection时,这些函数是未定义的

vm.items.filters
= undefined
通常,这些函数可以通过viewModel构造函数选项指定,但在我的情况下,这些项将作为更大的关系模型的一部分被下拉(目前正在使用工厂创建子viewModels),因此我不能这样做

我已经确认,创建一个新的kb.collectionObservable从头开始显示以下功能,即:

var collection = new kb.collectionObservable(new Backbone.Collection([
    new Backbone.Model({ ID: 1 }),
    new Backbone.Model({ ID: 2 })        
]))

collection.filters
= function()

任何帮助都将不胜感激。

因此最终的结果是,试图将所有内容都转换为kb.collectionObservable是错误的方法。更好的解决方案是创建一个次要的ko.computed结果,然后实现我需要的所有过滤和排序

var model = new Backbone.Model({
    items: new Backbone.Collection([
        new Backbone.Model({ ID: 1 }),
        new Backbone.Model({ ID: 2 })        
    ])
});

var vm = new kb.ViewModel(model);
vm.Sort() = ko.observable("asc");
vm.SortBy() = ko.observable("ID");
vm.Page() = ko.observable(1);
vm.Filters() = ko.observableArray([]);
vm.PageSize() = ko.observable(20);

vm.Filtered = ko.computed(function () {
    var items = vm.items;

    // Sorting
    items = items.sort(function (first, second) {
        var sortby = vm.SortBy();
        if (first[sortby]() == second[sortby]()) return 0;
        if (vm.Sort() == "asc") {
            return first[sortby]() < second[sortby]() ? -1 : 1;
        }
        if (vm.Sort() == "desc") {
            return first[sortby]() > second[sortby]() ? -1 : 1;
        }
        return 0;
    });

    // Filter
    items = ko.utils.arrayFilter(items, function (vm) {
        var filter = true;
        $.each(vm.Filters(), function (i, filtr) {
            var json = JSON.stringify(vm.model().attributes).toLowerCase();
            if (json.indexOf(filtr.toLowerCase()) < 0) filter = false;
        });
        return filter;
    });

    // Paging
    var startIndex = (vm.Page() - 1) * vm.PageSize();
    var endIndex = vm.Page() * vm.PageSize();
    items = items.slice(startIndex, endIndex);

    return items;
});
var model=新主干网。model({
项目:新主干。收藏([
新的主干.Model({ID:1}),
新主干.Model({ID:2})
])
});
var vm=新的kb.ViewModel(model);
vm.Sort()=ko.observable(“asc”);
vm.SortBy()=ko.observable(“ID”);
vm.Page()=ko.observable(1);
vm.Filters()=ko.observearray([]);
vm.PageSize()=ko.observable(20);
vm.Filtered=ko.computed(函数(){
var items=vm.items;
//分类
items=items.sort(函数(第一,第二){
var sortby=vm.sortby();
if(first[sortby]()==second[sortby]())返回0;
if(vm.Sort()=“asc”){
返回第一个[排序]()<第二个[排序]()?-1:1;
}
if(vm.Sort()=“desc”){
返回第一个[sortby]()>第二个[sortby]()?-1:1;
}
返回0;
});
//滤器
items=ko.utils.arrayFilter(项、函数(vm){
var filter=true;
$.each(vm.Filters(),函数(i,filter){
var json=json.stringify(vm.model().attributes).toLowerCase();
if(json.indexOf(filter.toLowerCase())<0)filter=false;
});
回流过滤器;
});
//寻呼
var startIndex=(vm.Page()-1)*vm.PageSize();
var endIndex=vm.Page()*vm.PageSize();
items=items.slice(startIndex,endIndex);
退货项目;
});
此外,您可能还需要在模型本身上设置排序,以便以正确的顺序添加新项目:

var setModelComparator = function () {
    vm.model().get("items").comparator = function (a, b) {
        var by = vm.Sort() == "asc" ? 1 : -1;
        var field = vm.SortBy();
        if (a.get(field) == 0) return -1 * by;
        if (b.get(field) == 0) return 1 * by;
        if (a.get(field) < b.get(field)) return 1 * by;
        if (a.get(field) > b.get(field)) return -1 * by;
        return 0;
    };
};
var setModelComparator=函数(){
vm.model().get(“items”).comparator=函数(a,b){
var by=vm.Sort()=“asc”?1:-1;
var field=vm.SortBy();
如果(a.get(field)==0)返回-1*by;
如果(b.get(field)==0)返回1*by;
如果(a.get(field)b.get(field))返回-1*by;
返回0;
};
};
也许这只是一个正在进行的击退工作,而不是更新API文档的情况,谁知道呢


还要感谢bvoleti,他指出了使用,这是击退武器库中非常重要的一部分,特别是与合作时。

尝试使用vm.items()?返回一组视图模型,而不访问我提到的那些函数。尝试: