【问题标题】:Backbone insert data inside Model from another骨干从另一个模型内部插入数据
【发布时间】:2013-07-20 16:40:21
【问题描述】:

我在主干中有一个简单的应用程序,其中逻辑对我来说不清楚,这是我的第二个应用程序,我不知道逻辑是否良好以及我如何构建它。
目标是当我加载一个页面时,我想检索特定目录的所有文件夹和文件并打印它。
我创建了一个应用程序,其中包含另一个名为文件夹的应用程序。 当我加载页面时,我创建了通用应用程序,在文件夹内搜索并将文件夹和文件检索到具有 ajax 功能的 json 中。
我已经成功了,但我的问题是现在如何填充我的 FolderView、FolderModel 和 Folder Collection? 我认为有必要这样做,但我不知道如何将此 json 传递给 FolderCollection/FolderModel。

这是我的应用视图

define(['jquery' , 'backbone', 'views/folder', 'models/folder', 'collections/folder', 'models/app'], 
    function($, Backbone, FolderView, FolderModel, FolderCollection, AppModel){
    var AppView = Backbone.View.extend({
        model: AppModel,
        el:$('#folder'),

        initialize: function(){
            console.log('initialize AppView');
            this.retrievFolderFile('uploads');
            //prendo le cartelle e le metto nel json

            this.folders = new FolderCollection();
            this.render();
            //this.todos.bind('sync', this.render, this);
            //this.todos.fetch();
        },
        render: function(){
            var element = this.$el;
            element.html('');
            this.folders.each(function(model){
                var folderView = new FolderView({model:model});

                element.append(folderView.el);
            });
        },
        retrievFolderFile: function(dir){
            var here = this;
            console.log('retrieveFolderFile');
            $.ajax({
                type: "POST",
                dataType: "json",
                data: {"dir": dir},
                url: 'function/retrieve_folder.php',
                success: function(data) {
                    console.log(data);
// ------------------ HERE I HAVE RESULT HOW TO PASS TO FOLDER VIEW/ COLLECTION?------
                }
            });
        }
    })

    return AppView;
});

这是我的文件夹模型

define(['backbone'],function(Backbone){
    var FolderModel = Backbone.Model.extend({
        defaults:{
            name:'Folder',
            path:''
        },
        initialize:function(){
            console.log('Initialized Folder model');
        }
    });

    return FolderModel;
});

这是我的文件夹集合

define(['backbone', 'models/folder'], function(Backbone, FolderModel){

    var folderCollection = Backbone.Collection.extend({
        model: FolderModel,
    });

    return folderCollection;
});

这是我的文件夹视图

define(['jquery', 'underscore', 'backbone', 'text!templates/folder.html'], function($, _, Backbone, FolderTemplate){
    var FolderView = Backbone.View.extend({
        el:$('#folder'),
        template: _.template(FolderTemplate),

        initialize: function(){
            console.log('FolderView initialized');
            this.render();
        },
        render: function(){
            console.log('FolderView render');

            //$(this.el).html(this.template({model: this.options.model}));
        }
    });

    return FolderView;
});

为了检索文件夹和文件,我使用这个文件 PHP,它返回一个有效的 json 到主干

<?php
$dir = $_POST['dir'];
$data = fillArrayWithFileNodes( new DirectoryIterator( '../'.$dir ) );

function fillArrayWithFileNodes( DirectoryIterator $dir )
{
  $data = array();
  foreach ( $dir as $node )
  {
    if ( $node->isDir() && !$node->isDot() )
    {
        //$data[$node->getFilename()] = fillArrayWithFileNodes( new DirectoryIterator( $node->getPathname() ) );
        $arr_to_insert = array();
        $arr_to_insert['name'] = $node->getFilename();
        $arr_to_insert['type'] = 'folder';
        array_push($data, $arr_to_insert);
    }
    else if ( $node->isFile() )
    {
      //$data[] = $node->getFilename();
        $arr_to_insert = array();
        $arr_to_insert['name'] = $node->getFilename();
        $arr_to_insert['type'] = 'file';
        array_push($data, $arr_to_insert);
    }
  }
  return $data;
}
echo json_encode($data);
?>

如何从 appview 传递返回给我的 json? 在 appview 中进行文件夹和字段搜索是否正确,或者我必须在文件夹模型中进行? 因为当我点击一个文件夹后,我想再次检索它的文件和文件夹。 帮助我理解逻辑以及如何通过它。 我想在 FolderCollection 中调用一个函数,如 parseFolderFile 并将其插入模型中,但如何?

谢谢

【问题讨论】:

    标签: json backbone.js require


    【解决方案1】:

    AJAX异步的..所以您正在进行 ajax 调用,然后调用在集合上迭代并呈现它们的 render 方法。

    但是在成功回调之前和之后,您的数据还没有准备好,我猜您的集合将被填充。所以你应该在成功回调中填充集合,然后调用渲染。

    所以在这些行中有一些东西

    initialize: function () {
        console.log('initialize AppView');
        this.folders = new FolderCollection();
        this.retrievFolderFile('uploads');
    },
    render: function () {
        var element = this.$el;
        element.html('');
        this.folders.each(function (model) {
            var folderView = new FolderView({
                model: model
            });
            element.append(folderView.el);
        });
    },
    retrievFolderFile: function (dir) {
        var here = this;
        console.log('retrieveFolderFile');
        $.ajax({
            type: "POST",
            dataType: "json",
            data: {
                "dir": dir
            },
            url: 'function/retrieve_folder.php',
            success: function (data) {
                console.log(data);
                here.folders.set(data);
                here.render();
            }
        });
    }
    

    还有你为什么要处理一个 ajax 请求,其中已经有一个由主干提供的本地请求。

    您可以在集合中声明 urlthis.folders.fetch() ,然后收听 sync 或重新发送的事件,这在我看来会更干净。

    使用原生 Fetch

    define(['jquery', 'backbone', 'views/folder', 'models/folder',
                                 'collections/folder', 'models/app'],
    
    function ($, Backbone, FolderView, FolderModel,
                                    FolderCollection, AppModel) {
        var AppView = Backbone.View.extend({
            model: AppModel,
            el: $('#folder'),
    
            initialize: function () {
                this.folders = new FolderCollection();
                // This will automatically call the render once the 
                // collection is reset 
                this.listenTo(this.folders, 'reset', this.render);
                this.folders.data = 'uploads';
                this.folders.fetch();
            },
            render: function () {
                var element = this.$el;
                element.html('');
                this.folders.each(function (model) {
                    var folderView = new FolderView({
                        model: model
                    });
    
                    element.append(folderView.el);
                });
            }
        })
    
        return AppView;
    });
    
    define(['backbone', 'models/folder'], function(Backbone, FolderModel){
    
        var folderCollection = Backbone.Collection.extend({
            model: FolderModel,
            url : 'function/retrieve_folder.php' + this.data;
        });
    
        return folderCollection;
    });
    

    【讨论】:

    • 一个有趣的本地调用解决方案...嗯,谢谢,我认为这是解决我的问题的好方法!
    • 很高兴能帮上忙.. :) 那么一旦与听众联系起来,您就不必担心处理异步调用了.. 这始终是最好的方法
    • 只有当我进行提取时如何将数据设置到我的集合中?我可以做这个? this.folders.set(this.folders.fetch()) ?
    • .fetch 返回一个jqXHR,这不是您想要的。此外,当获取集合时,集合会自动填充您发送的数据。无需再次显式设置
    • 好的理解,但在这种情况下,我必须以哪种模式将获取的集合传递给视图?
    猜你喜欢
    • 1970-01-01
    • 2015-10-26
    • 2020-02-29
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    • 2014-06-25
    • 2012-05-04
    • 2012-02-13
    相关资源
    最近更新 更多