backbone-folder-ui
文件大小: unknow
源码售价: 5 个金币 积分规则     积分充值
资源说明:Backbone Folder UI is a library that allows developers to create folder UIs. The library is built on the Backbone framework, with an object-oriented structure that allows for easy extension.
# Backbone Tree

The Backbone Tree is a library that allows developers to create tree sets of data. The library is built on the Backbone framework, with an object-oriented structure that allows for easy extension.

A picture is worth a thousand words, so here's a what the Backbone Tree looks like in action:

![](http://cl.ly/EQMd/Image%202012.02.21%203:26:43%20PM.png)


##Features

* Nested folders
* Select & unselect
* Drag and drop reordering
* Data persistance with serialization and deserialization
* Powerful event model
* Build on Backbone

##Getting Started

Ensure that the dependent libraries - Underscore, Backbone, and jQuery - are included on your page. Next, include the library scripts:

    
    
    

To create a new tree, first create a new instance of the `Tree` class. Next, create a `TreeView` instance and link it to the tree class by setting it's `model` property. The `TreeView` renders the `Tree`s data in its `el` property.

    var tree = new Tree();
    var tree_view = new TreeView({"model": tree});
    $("#tree").html( tree_view.el )

Trees contain two types of items - `TreeItem` and `Folder` instances. Let's create an instance of each

    var item = new TreeItem({"title": "Item A"});
    var folder = new Folder({"title": "Folder 1", "children": [item]})

Trees and folders have `add` and `remove` methods to add items after they have been initialized:

    tree.add( folder );

Tada! The `#tree` element now shows folder `Folder 1` and it's child `Item A`. Our `TreeView` instance monitors for all changes to the tree, and automatically updates itself on every change.

We can use Backbone's built in methods to view and manipulate our data

    tree.each(function(child) { console.log(child); }); //Folder 1
    tree.length(); //1
    tree.remove( folder );

We can also use built-in methods to find child items and loop through nested children
    
    tree.nested_each(function(child) { console.log(child); }); //Folder 1, Item A
    tree.flatten().length(); //2
    tree.get_item("Item A", "title"); //returns `item`

##Items

Items are the simplest data types in the tree. They look something like this:

![](http://cl.ly/EPid/Image%202012.02.21%204:52:38%20PM.png)

###Creating items

Items can be created by initializing a new instance of `TreeItem` and adding it to either a `Tree` or a `Folder` instance:

    var item = new TreeItem({"title": "Item A"});
    tree.add( item );
    item.set({"title": "Item A - modified"});

###Methods

The `TreeItem` extends `Backbone.Model`, and therefore has access to all of its [properties and methods](http://backbonejs.org/#Model).

The TreeItem has several special properties. 

* `id`: internal id of the instance
* `title`: the title to be shown
* `hidden`: a Boolean value indicating if the item is shown or not (e.g. when a containing folder is closed)
* `click`: an optional `function` callback; called when the item's title is clicked
* `selected`: a Boolean value indicating if the item has been selected
* `selectable`: a Boolean value indicating if the item is capable of being selected; determines if a select checkbox is rendered for the item

These properties can be changed with Backbone's `get` and `set` methods (e.g. `item.get('title');` or `item.set({'title': 'Item A - modified'});`)

* `serialize()`: converts the item's data into a JSON object
* `deserialize( json )`: updates itself with the passed JSON object
* `is_selected()`: returns a Boolean result indicating if the item is selected; if `selectable` is set to `false`, will always return `false`

###Events

* `change:*`: the `*` will vary based on the property that was changed (e.g. `change:title`)
* `change`: triggered every time a property is changed

##Folders

The `Folder` model shares all of the methods and properties of the `TreeItem` model, and includes several methods and properties of its own. Here's what a folder looks like:

![](http://cl.ly/EPTK/Image%202012.02.21%205:00:40%20PM.png)

###Creating folders

Folders are created in much the same way as `TreeItem`s. An optional array of `children` may be passed; this will be converted into a `Backbone.Collection`

    var folder = new Folder({"title": "Folder 1", "children": [item]});
    tree.add( folder );

Trees and Folders both store their children in the `children` property, which in turn is a `Backbone.Collection` instance. As such, we can use all of the `Backbone.Collection` [methods](http://backbonejs.org/#Collection-Underscore-Methods) to add, remove, and retrieve items. Let's add the newly created folder to the tree

    tree_instance.get("children").filter(function(item) { return item.id % 2; });

###Properties

The `Folder` includes all the `TreeItem`s properties, as well as the following:

* `children`: a `Backbone.Collection` instance of all of the folder's child folders and items

###Methods

* `add( item, position )`: adds an item to the folder. Can pass in an individual item or list of item. The optional `position` value specifies where the item is added, but defaults to the end of the folder
* `remove( item )`: remove the referenced item from the folder
* `move( item, position )`: move an item from the folder to the new position
* `each( callback )`: loops thorugh each item in the folder
* `length()`: return the number of children in the folder
* `nested_each( callback )`: recursively loops through each item in the folder, including their children if they are folders 
* `get_item( value, variable_name, type )`: look for an item with the `id` of `value`. The search takes place recursively thorugh nested folders. The optional `variable_name` allows us to specify an alternative property to serach values by (e.g. title). The optional `type` property lets us limit our search to items with a specific constructor (e.g. `folder`)
* `flatten()`: returns a backbone collection of all of items in folder, including nested children
* `selected()`: returns all selected items in folder, including nested children

###Events

Folders have the following events in addition the the `TreeItem`s `change` events:

* `add`: triggered when item is added to folder
* `remove`: triggered when item is removed from folder
* `move`: triggered when a child's position is changed in the folder
* `save:hidden`: a special event that is triggered when the hidde indicator is clicked by a user; triggered in addition to the `change:hidden` event, which is fired if the value is changed programmatically

##Tree

Trees share all of the properties of folders, but add two unique properties:

* `sortable`: A Boolean value that determines if the tree can be reordered with drag & drop
* `show_select_all`: A Boolean value that determines if we should show a "Select All/None" dialog in the tree view

###Sorting

Trees can be sorted via drag & drop, thanks to the excellent [nestedSort](http://mjsarfatti.com/sandbox/nestedSortable/) jQuery plugin. To enable drag & drop sorting, include the nestedSort library in your page and set the `sortable` Tree property  to true. The tree structure will be automatically updated as the user moves folders items around, and `add`, `remove`, and `move` events will be triggered as appropriate.

##Serialization & Deserialization

Items, Folders, and Trees can all be serialized and deserialized from JSON objects with the `serialize` and `deserialize` command. This functionality allows you to create dynamic trees on the client side, store them remotely or via local storage, and then recall them at a later time. Note that the `click` property of `TreeItem` and `Folder` objects is lost during serialization, as we are unable to serialize functions

##Constructors

Both `TreeItem` and `Folder` classes have a `constructor` property, which is a string representing the type of object they represent. When an item is serialized, the `constructor` property is passed in to distinguish the data type. When the `deserialize` method is called on a `Tree` or a `Folder`, the `constructor` property is used to determine what classes to initialize for each child.

A global `window.tree_constructors` dictionary contains a reference to the model and view classes for each `constructor` type. This dictionary is what allows the Folder and Tree instances to know what models to initialize on deserialization. Here's what the default `tree_constructor` looks like:

    window.tree_constructors = {
        "models": {
            "item": TreeItem,
            "folder": Folder
        },
        "views": {
            "item": TreeItemView,
            "folder": FolderView
        }
    }

If you are extending the tree with your own custom types, be sure to set a `constructor` property on your model and assign corresponding properties to the tree_constructor dictionary

##Tree Views

As of now, the Backbone Tree only has one way of presenting trees. The default `TreeView` ties into a `Tree` instance by setting it as the `model` property. Alternate views for tree data will be coming soon!

##Download & Contribute

To download the latest version of the library, click on the `Zip` button at the top of the page. We welcome all feature requests, issues, and pull requests.

##License

Copyright (c) 2012 Top Hat Monocle, http://tophatmonocle.com/

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

本源码包内暂不包含可直接显示的源代码文件,请下载源码包。