0

newAttributes メソッド内の formView では、エントリ ビューを表示するイベントをトリガーしたいと考えています (両方ともここに表示されています)。これを行うには、コントローラーを使用する必要がありますか? トリガーと listenTo コマンドをどのように設定しても、別のエラーが発生するようです。

MyApp = new Backbone.Marionette.Application();

MyApp.addRegions({
    formBox : '#formBox',
    listBox : '#listBox'
});

Entry = Backbone.Model.extend({
    defaults: {
        DB : 'not specified',
        CT : 'not specified',
        go : 'not specified'
    },
});

EntryList = Backbone.Collection.extend({
    model: Entry
});

FormView = Backbone.Marionette.ItemView.extend({
    tagName: 'div',
    template: '#form-template',
    className: 'form',

    ui: {
        DB: '#DB',
        CT: '#CT',
        gos: '#gos'
    },

    events:{
        'click #processInput' : 'validateForm'
    },

    onRender: function(){
        console.log("rendering...");
    },

    validateForm : function(){
        var validInput = true;

        if(!this.ui.DB.val().trim())
        {
            validInput = false;
        !this.ui.DB.css("background-color","#CC0000");  
        }
        else
        {
            !this.ui.DB.css("background-color","#ffffff");
        }
        if(!this.ui.CT.val().trim())
        {   
            validInput = false;
        this.ui.CT.css("background-color","#CC0000");
        }
        else
        {
            this.ui.CT.css("background-color","#ffffff");
        }
        if(!this.ui.gos.val().trim())
        {
            validInput = false;
        this.ui.gos.css("background-color","#CC0000");
        }
        else
        {
            this.ui.gos.css("background-color","#ffffff");
        }

        if(validInput)
        {
            this.hideForm();
        this.getEntries(this.ui.DB.val().trim(),
        this.ui.CT.val().trim(),this.ui.gos.val().trim());
        }
    },

    newAttributes :function(db,con,gos){
        for(go in gos)
        {
            MyApp.ents.add({DB : db, CT: con, go: gos[go]});
        }
        //TRIGGER CUSTOM EVENT
    },


    getEntries : function(db,con,gos){
        var gos = gos.split("\n");
        for(go in gos)
        {
            console.log("data bank: " + db + " CT: " + con + " go: |" +                                                                                                                                                  gos[go].trim()+"|");
        }   
            this.newAttributes(db,con,gos);
    },

    hideForm : function(){
        this.$el.hide();
    }
});

EntryView = Backbone.Marionette.ItemView.extend({
    tagName: 'tr',
    template: '#entry-template',
    className: 'entry',

    events: {
        'click .delete' : 'destroy'
    },

    destroy : function(){
        this.model.destroy();
    }
});

EntriesView = Backbone.Marionette.CompositeView.extend({
    tagName: 'table',
    template: '#entries-template',
    itemView: EntryView,

    appendHtml: function(collectionView, itemView){
            colleCTionView.$('tbody').append(itemView.el);      
    }
});

MyApp.addInitializer(function(test){     
    var entriesView = new EntriesView({
          collection: test.DB
    });

    var formView = new FormView();

    //SHOW on load
    MyApp.formBox.show(formView);  
    //SHOW Later with custom event
    MyApp.listBox.show(entriesView)
    });

    $(document).ready(function(){
      MyApp.ents = new EntryList([]);
      MyApp.start({DB: MyApp.ents});
    });
4

1 に答える 1

0

問題を解決する方法は 2 つあります。

最もクリーンな方法は、コントローラーを使用し、コントローラー内のビュー インスタンスでトリガーされたイベントをリッスンすることです。たとえば、あなたのビューでは、持っていてthis.trigger("my:event")、コントローラーではmyFormViewInstance.on("my:event", function(...){...})

もう 1 つのオプション (実際にはお勧めしません) は、アプリケーション レベルでイベントをトリガーし、アプリケーション レベルの別の場所でもイベントをリッスンすることです。つまりMyApp.trigger("my:event")MyApp.listen("my:event")

于 2013-07-09T21:05:41.550 に答える