Javascript 如何从外部文件访问模型视图中的变量

Javascript 如何从外部文件访问模型视图中的变量,javascript,backbone.js,Javascript,Backbone.js,嗨,我有一个与我的主干代码有关的基本问题 我首先在一个名为js.js的文件中初始化4个SpinnerView。在名为app.js的主代码文件中,我声明了模型视图,每个视图中都有一个名为Spinner的模型。每个微调器中都有一个名为WordCollection的集合,集合中有一个名为Word的模型 问题是,如何访问SpinnerView中的“test”变量,仅在文件js.js中的4个渲染之一(即第3个SpinnerView渲染)中 一切帮助都将不胜感激。谢谢 下面是我在渲染微调器的文件中的代码示例

嗨,我有一个与我的主干代码有关的基本问题

我首先在一个名为js.js的文件中初始化4个SpinnerView。在名为app.js的主代码文件中,我声明了模型视图,每个视图中都有一个名为Spinner的模型。每个微调器中都有一个名为WordCollection的集合,集合中有一个名为Word的模型

问题是,如何访问SpinnerView中的“test”变量,仅在文件js.js中的4个渲染之一(即第3个SpinnerView渲染)中

一切帮助都将不胜感激。谢谢

下面是我在渲染微调器的文件中的代码示例:

//file js.js
(new SpinnerView()).render();
(new SpinnerView()).render();
(new SpinnerView()).render();
(new SpinnerView()).render();
下面是我的主代码文件中的代码示例:

//file app.js
(function($) {

// model word
window.Word = Backbone.Model.extend({
    url: 'save.php',

     defaults: {
        word: '',
    }
});

//collection word
window.WordCollection = Backbone.Collection.extend({
    model: Word
});

// spinner model
window.Spinner = Backbone.Model.extend({

    url: '/beta/save.php',

    wordCollection: null,

    defaults: {
        title: 'title',
    },

    initialize: function() {
        this.wordCollection = new WordCollection();
    },

    addWord: function(bs) {
        this.wordCollection.add(bs);
    }

});

// spinner view
window.SpinnerView = Backbone.View.extend({
    template: null,
    spinner: null,
    el: '',
            test: false, //<---- THIS IS THE VARIABLE I WANT TO ACCESS

    initialize: function() {
        _.bindAll(this, 'focusAddWord', 'addWord', 'onEnterAddWord', 'focusSetTitle', 'setTitle', 'onEnterSetTitle');
        this.template = _.template($('#spinner-template').text());
        this.spinner = new Spinner();

    },

    render: function() {

        var el = $(this.template()).appendTo('.spinners');
        this.setElement(el);

    },

    focusAddWord: function() {

            this.$el.find('.add-word-input input').val('');
            this.$el.find('.add-word-input input').focus();

    },

    addWord: function() {
        var word = new Word();
        var val = this.$el.find('.add-word-input input').val();

        // validate minimum characters
        if(this.$el.find('.add-word-input input').val().length > 0){

            // go on
            this.spinner.addWord({
                word: val,
            });

            word.set({
                word: val,
            });

            word.toJSON();
            word.save();

            this.$el.find('.add-word-input').hide();
            this.renderWordCollection();
        }
        this.$el.find('.add-word-input').hide();

    },

    onEnterAddWord: function(ev) {
        if (ev.keyCode === 13) {
            this.$el.find('.add-word-input input').trigger('blur');
            this.$el.find('.viewbox').trigger('click');
        }
    },

    focusSetTitle: function() {
        this.$el.find('.set-title-input input').val('');
        this.$el.find('.set-title-input input').focus();
        this.$el.find('.set-title-input input').addClass('input-active');
    },

    setTitle: function() {

        var val = this.$el.find('.set-title-input input').val();

        if(this.$el.find('.set-title-input input').val().length > 0){

            // go on
            this.spinner.set('title', val);

            this.spinner.toJSON();
            this.spinner.save();

        }
    },

    onEnterSetTitle: function(ev) {
        if (ev.keyCode === 13) {
            this.$el.find('.set-title-input input').trigger('blur');
        }
    },

    // call after adding a word to spinner.
    renderWordCollection: function() {

        var wc = this.spinner.wordCollection; 
        var ListTemplate = _.template($('#word-collection-template').html(),{wc: wc});

        this.$el.find('ul').html(ListTemplate);

    }

});

})(jQuery);
//文件app.js
(函数($){
//标准词
window.Word=Backbone.Model.extend({
url:'save.php',
默认值:{
字:'',
}
});
//集合词
window.WordCollection=Backbone.Collection.extend({
型号:Word
});
//旋转器模型
window.Spinner=Backbone.Model.extend({
url:“/beta/save.php”,
wordCollection:null,
默认值:{
标题:“标题”,
},
初始化:函数(){
this.wordCollection=新的wordCollection();
},
附加字:功能(bs){
this.wordCollection.add(bs);
}
});
//微调器视图
window.SpinnerView=Backbone.View.extend({
模板:null,
微调器:空,
el:“,
测试:false,//0){
//继续
这个.spinner.addWord({
字:瓦尔,
});
word.set({
字:瓦尔,
});
toJSON();
word.save();
这个.el.find('.add word input').hide();
这个.renderWordCollection();
}
这个.el.find('.add word input').hide();
},
单字:功能(ev){
如果(ev.keyCode===13){
这个.el.find('.add word input').trigger('blur');
这个.el.find('.viewbox').trigger('click');
}
},
focusSetTitle:function(){
此.el.find('.set title input').val('');
这是.el.find('.set title input').focus();
这个.el.find('.set title input').addClass('input-active');
},
setTitle:function(){
var val=this.$el.find('.set title input').val();
if(此.$el.find('.set title input').val().length>0){
//继续
this.spinner.set('title',val);
this.spinner.toJSON();
this.spinner.save();
}
},
OneNetSetTitle:功能(ev){
如果(ev.keyCode===13){
这个.el.find('.set title input').trigger('blur');
}
},
//在向微调器添加单词后调用。
renderWordCollection:函数(){
var wc=this.spinner.wordCollection;
var ListTemplate=35;.template($('#单词集合模板').html(),{wc:wc});
此.el.find('ul').html(列表模板);
}
});
})(jQuery);

不完全清楚您想对
测试执行什么操作,但要将其用作实例变量,只需初始化它:

window.SpinnerView = Backbone.View.extend({
     // code removed for brevity

        test: false, //<---- THIS IS THE VARIABLE I WANT TO ACCESS

    initialize: function() {
        _.bindAll(this, 'focusAddWord', 'addWord', 'onEnterAddWord', 'focusSetTitle', 'setTitle', 'onEnterSetTitle');
        this.template = _.template($('#spinner-template').text());
        this.spinner = new Spinner();
        this.test = false, //<---- PUT IT HERE
    },
您也可以从外部访问它:

var view = new SpinnerView();
view.render();
console.log(view.test);
并对其进行修改:

view.test = true;
此外,不要忘记在实例化视图时可以传递选项:

    initialize: function(options) {
        _.bindAll(this, 'focusAddWord', 'addWord', 'onEnterAddWord', 'focusSetTitle', 'setTitle', 'onEnterSetTitle');
        this.template = _.template($('#spinner-template').text());
        this.spinner = new Spinner();
        // use an empty `options` object if none is provided, fallback to `false` default
        this.test = (options || {}).mustBeTested || false,
    },

    // ...

    focusAddWord: function() {
      if(this.test){
        // do something when the view needs to be tested
      }
      this.$el.find('.add-word-input input').val('');
      this.$el.find('.add-word-input input').focus();
    },
然后,您只需根据需要传递选项:

(new SpinnerView()).render();
(new SpinnerView()).render();
(new SpinnerView({ mustBeTested: true })).render();
(new SpinnerView()).render();

谢谢你的回答。我仍然有同样的问题,我如何访问测试只在一个渲染,而不是在所有的感谢很多,非常有用的答案。现在如何在渲染后访问变量以修改它。我更新了答案:您只需更改属性的值。但是很明显,您需要对视图实例的引用。快速提问,如何引用视图?我试过一些把戏,但运气不好。感谢您的回复var view=new SpinnerView();
(new SpinnerView()).render();
(new SpinnerView()).render();
(new SpinnerView({ mustBeTested: true })).render();
(new SpinnerView()).render();