Backbone.js 铆钉,主干。视图和主干。集合

Backbone.js 铆钉,主干。视图和主干。集合,backbone.js,rivets.js,Backbone.js,Rivets.js,在过去的视图周中,我尝试了许多方法使铆钉与Backbone.view和Backbone.Collection一起工作。我在互联网上找到的例子涵盖了我所有的尝试。但是,我仍然没有成功 以下是我目前试图实现的挑战: 使铆钉识别主干。收集并观察所有事件 使用Backbone.View作为铆钉的模板,该模板保存Backbone.Collection中所有对象的输入字段 使用所有这些,通过覆盖铆钉函数来实现铆钉的“.”-适配器,如网络上的许多示例所示 我的适配器源代码如下所示: var dot

在过去的视图周中,我尝试了许多方法使铆钉与Backbone.view和Backbone.Collection一起工作。我在互联网上找到的例子涵盖了我所有的尝试。但是,我仍然没有成功

以下是我目前试图实现的挑战:

  • 使铆钉识别主干。收集并观察所有事件
  • 使用Backbone.View作为铆钉的模板,该模板保存Backbone.Collection中所有对象的输入字段
  • 使用所有这些,通过覆盖铆钉函数来实现铆钉的“.”-适配器,如网络上的许多示例所示
我的适配器源代码如下所示:

    var dotAdapter = rivets.adapters[
        '.'],
        originalSubscribe =
            dotAdapter.subscribe,
        originalUnsubscribe =
            dotAdapter.unsubscribe;

    dotAdapter.subscribe = function (obj, keypath, callback) {          
        if (obj === undefined || obj === null) {
            return;
        }

      // Subscribe model
      if (obj instanceof Backbone.Collection) {

                obj.on('add remove reset', function () {
                        callback(obj);
                    });

                obj.on('change:' + keypath, function (
                        m, v) {
                        callback(v);
                    });

        } else if (obj != null && obj instanceof Backbone.Model) {

            obj.on('change:' + keypath, function (
                    m, v) {
                    callback(v);
                });

            obj.on('reset:' +
                    keypath, function (
                        m, v) {
                        callback(v);
                    });
        } else {
            originalSubscribe.apply(
                this, arguments);
        }
    };

    dotAdapter.unsubscribe =
        function (obj, keypath,callback) {
            if (obj === undefined || obj === null ) {
                return;
            }

           // Unsubscribe model
           if (obj instanceof Backbone.Collection) {
                obj.off('add remove reset', function () {
                        callback(
                                obj);
                    });

                obj.off('change:' + keypath, function (m, v) {
                    callback(v);
                });

            }
            else if (obj instanceof Backbone.Model) {
                obj.off('change:' + keypath, function (m, v) {
                        callback(v);
                    });
                obj.off('reset:' + keypath, function (m, v) {
                            debugger;
                            callback(v);
                        });
            } else {
                originalUnsubscribe.apply(
                    this, arguments);
            }
    };

    dotAdapter.read = function (obj,keypath) {
        if (obj === null || obj === undefined ) {
            return;
        }

        if (obj instanceof Backbone.Model) {
            return obj.get(keypath);
        }
        else if (obj instanceof Backbone.Collection)
        {
            return obj.models;
        } else {
            return obj[keypath];
        }

    };

    dotAdapter.publish =  function (obj, keypath, value) {
        if (value === "") {
            value = null;
        }

        if (obj instanceof Backbone.Collection) {
            obj.models = value;
        }
        else if (obj instanceof Backbone.Model) {
            obj.set(keypath, value);
        }
        else {
            obj[keypath] = value;
        }
    };
get: function(obj, keypath) {
 if(obj instanceof Backbone.Model)
    return obj.get(keypath);
 return obj[keypath];
},
有人能告诉我正确的方向吗?我该如何覆盖铆钉的“.”-适配器,以使其与Backbone.Collection对象一起工作


在我的收藏中,我会有主干。模型对象,它们应该显示在相应的模板上。

我对铆钉是新手。所以我在搜索适配器并尝试了你的代码。这对我有用。所以我把这个贴出来,这样可能会对像我这样的人有所帮助

我的html页面包含以下类似于“:”适配器的内容

<ul id='item-list'>
<li rv-each-contact="contacts:">
  <a  rv-href='contact:url' >{contact:Name}</a></br></br>
  </li>

</ul>



  • 为了使代码适用于“.”适配器,我更改了行

    <li rv-each-contact="contacts:">
    
  • 我强烈建议不要覆盖默认的
    适配器

    这可能会导致意外行为,例如,在我工作过的一个项目中,有人将
    适配器改写为以下内容:

        var dotAdapter = rivets.adapters[
            '.'],
            originalSubscribe =
                dotAdapter.subscribe,
            originalUnsubscribe =
                dotAdapter.unsubscribe;
    
        dotAdapter.subscribe = function (obj, keypath, callback) {          
            if (obj === undefined || obj === null) {
                return;
            }
    
          // Subscribe model
          if (obj instanceof Backbone.Collection) {
    
                    obj.on('add remove reset', function () {
                            callback(obj);
                        });
    
                    obj.on('change:' + keypath, function (
                            m, v) {
                            callback(v);
                        });
    
            } else if (obj != null && obj instanceof Backbone.Model) {
    
                obj.on('change:' + keypath, function (
                        m, v) {
                        callback(v);
                    });
    
                obj.on('reset:' +
                        keypath, function (
                            m, v) {
                            callback(v);
                        });
            } else {
                originalSubscribe.apply(
                    this, arguments);
            }
        };
    
        dotAdapter.unsubscribe =
            function (obj, keypath,callback) {
                if (obj === undefined || obj === null ) {
                    return;
                }
    
               // Unsubscribe model
               if (obj instanceof Backbone.Collection) {
                    obj.off('add remove reset', function () {
                            callback(
                                    obj);
                        });
    
                    obj.off('change:' + keypath, function (m, v) {
                        callback(v);
                    });
    
                }
                else if (obj instanceof Backbone.Model) {
                    obj.off('change:' + keypath, function (m, v) {
                            callback(v);
                        });
                    obj.off('reset:' + keypath, function (m, v) {
                                debugger;
                                callback(v);
                            });
                } else {
                    originalUnsubscribe.apply(
                        this, arguments);
                }
        };
    
        dotAdapter.read = function (obj,keypath) {
            if (obj === null || obj === undefined ) {
                return;
            }
    
            if (obj instanceof Backbone.Model) {
                return obj.get(keypath);
            }
            else if (obj instanceof Backbone.Collection)
            {
                return obj.models;
            } else {
                return obj[keypath];
            }
    
        };
    
        dotAdapter.publish =  function (obj, keypath, value) {
            if (value === "") {
                value = null;
            }
    
            if (obj instanceof Backbone.Collection) {
                obj.models = value;
            }
            else if (obj instanceof Backbone.Model) {
                obj.set(keypath, value);
            }
            else {
                obj[keypath] = value;
            }
        };
    
    get: function(obj, keypath) {
     if(obj instanceof Backbone.Model)
        return obj.get(keypath);
     return obj[keypath];
    },
    
    这导致其他开发人员无法访问模型中的直接属性(属性
    之外的属性
    ),这导致了一些奇怪的错误

    出于这些原因,最好为特殊用例创建单独的适配器。此外,它们还可以通过查看绑定更容易地理解对象之间的关系,这在处理嵌套结构时非常有用

    例如:
    users:roles.admin:priviledges.create//看到这一点,我们发现用户和管理员都是模型

    下面是一个简单的例子,使用了铆钉.js文档中展示的

    由于对象是通过javascript中的引用传递的,所以对模型的更新将自动反映在集合中,无需担心让铆钉观察主干集合事件

    铆钉.适配器[':']={
    观察:函数(obj、键路径、回调){
    obj.on('change:'+keypath,回调)
    },
    unobserve:函数(obj、键路径、回调){
    obj.off('change:'+keypath,回调)
    },
    get:函数(obj、键路径){
    返回对象get(keypath)
    },
    设置:功能(对象、关键路径、值){
    对象集(键路径、值)
    }
    }
    风险值数据=[{
    姓名:“约翰”,
    年龄:10
    }, {
    姓名:“约瑟夫”,
    年龄:11
    }, {
    名称:“欢乐”,
    年龄:12
    }]
    var userCollection=new Backbone.Collection(数据);
    var View=Backbone.View.extend({
    初始化:函数(选项){
    this.render()
    },
    render:function(){
    铆钉。捆扎(本节){
    用户:这是我的收藏
    });
    }
    });
    var userView=新视图({
    el:“#用户列表”,
    集合:userCollection
    });
    
    
    
    • {用户:姓名}{用户:年龄}