0

Backbon.js ビュー内のヘルパー関数に問題があります。実行すると、「addCalc」関数の最初の行に関する次のエラー メッセージが表示されて終了します。

TypeError: this.getCalcValue は関数ではありません

ちょうど上で定義された「初期化」関数では、すべての関数が定義されているように見えるので、それは本当に不可解です。兄弟メソッドを間違って呼び出しているように感じます。「initialize」メソッドは、「this」を使用してオブジェクトを参照できる例外です。

次のコードに何か問題や不足がありますか、またはバックボーンのドキュメントで見逃したものはありますか?

CalcView = Backbone.View.extend({
    el: $("#calcView"),
    initialize: function () {
        this.resetCalc();
    },

    addCalc: function (model) {
        var cost = this.getCalcValue(model.get('currentCost'));
        var custom = this.getCalcValue(model.get('customProgram'));

        var variables = { id: model.get('id'),
                category: model.get('category'),
                shortDesc: model.get('shortDescription'),
                description: model.get('description'),
                currentCost: cost,
                customProgram: custom,
        };

        var template = _.template($('#calc_template').html(), variables);
        $("#calc_payload").append(template);
    },

    resetCalc: function(models) {
        $("#calc_payload tr").remove();
    },

    removeCalc: function(model){
        $("#calc_payload #" + model.get('id')).remove();
    },

    updateCalcs: function(model) {

        var cost = model.get('currentCost');
        var custom = model.get('customProgram');

        $("#" + model.get("id") + " .currentCost").text(this.getCalcValue(cost));
        $("#" + model.get("id") + " .customProgram").text(this.getCalcValue(custom));

        /*var currentCostSum = 0;
        var customProgramSum = 0;
        $("#calc_payload .currentCost").each(function() {
            var temp = Number(($(this).text()).replace(/[^0-9\.]+/g, ""));
            if (!isNaN(temp))
                    currentCostSum += temp;
        });

        $("#calc_payload .customProgram").each(function() {
            var temp = Number(($(this).text()).replace(/[^0-9\.]+/g, ""));
            if (!isNaN(temp))
                customProgramSum += temp;
        });

        $("#calc_footer .currentCost").text("$" + ((currentCostSum == 0) ? " -- " : CurrencyFormatted(currentCostSum.toFixed(2))));
        $("#calc_footer .customProgram").text("$" + ((customProgramSum == 0) ? " -- " : CurrencyFormatted(customProgramSum.toFixed(2))));*/
    },

    getCalcValue: function(value) {
        if (typeof value == 'string' || value instanceof String)
            return value.toString();
        else if (isNaN(value))
            return "$ -- ";
        else
            return "$" + value.toFixed(2); 
    },                  
});

「addCalc」関数を実行するコードは、バックボーン コレクションによって駆動されます。基本的に、コレクションが追加されると、 CalcView.addCalc が呼び出されます

Calculations = Backbone.Collection.extend({
    model: Calculation,
    //This is our Friends collection and holds our Friend models
    initialize: function (models, options) {
        this.on("add", options.onAdd);
        this.on("remove", options.onRemove);
        this.on("reset", options.onReset);
        //Listen for new additions to the collection and call a view function if so
    }
});


//This is where addCalc is used.
var calcview = new CalcView();
var calc_collection = new Calculations( null, { 
    onAdd: calcview.addCalc, 
    onRemove: calcview.removeCalc, 
    onReset: calcview.resetCalc 
});
4

2 に答える 2

0

イベントをバインドすると、3 番目の引数としてcollection送信できます。contextオプション プロパティをもう 1 つ送信calcviewして、コンテキストとして渡してみてください。

this.on("add", options.onAdd, options.calcview);
this.on("remove", options.onRemove, options.calcview);
this.on("reset", options.onReset, options.calcview);
于 2013-09-18T15:04:51.837 に答える