想要在点击时向javascript处理程序发送特定值

时间:2017-03-09 10:24:44

标签: javascript backbone.js

我正在创建多个对象并绑定到同一个处理程序。我的要求是我想在调用时发送特定值来处理。

代码:

sliderObj = [];
for(i=0;i<3;i++)
{
    sliderObj[i] = this._turntableSlider = new SliderView();
    sliderObj[i].on("change:value", this._handleChangeSpeedSlider);
}

当为sliderObj [0]调用处理程序时,想要为sliderObj [1]等发送类似于1的值0。

请帮我解决这个问题。

2 个答案:

答案 0 :(得分:2)

尝试使用.bind()

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import com.honeywell.scanintent.ScanIntent;

public class MainActivity extends Activity {
    TextView barcodeData = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        barcodeData = (TextView) findViewById(R.id.textView);
    }

    public void onSendButtonClick(View v) {
        Intent intentScan = new Intent(ScanIntent.SCAN_ACTION);
        intentScan.addCategory(Intent.CATEGORY_DEFAULT);

        intentScan.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        intentScan.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);

        int loadmode = 0;

        intentScan.putExtra("scan_mode",ScanIntent.SCAN_MODE_RESULT_AS_URI);
        this.startActivityForResult(intentScan, 5);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        if (resultCode == ScanIntent.SCAN_RESULT_SUCCESSED) {
            String data = intent.getStringExtra(ScanIntent.EXTRA_RESULT_BARCODE_DATA);
            int format = intent.getIntExtra(ScanIntent.EXTRA_RESULT_BARCODE_FORMAT, 0);
            barcodeData.setText(data);
        }
        else{
            barcodeData.setText("FALLITO");
        }
    }
}

Simple demo

答案 1 :(得分:1)

Prefer listenTo over on

传递索引

最简单的解决方案是将回调包装成匿名函数。

但是由于我们循环并且i的值会改变,我们需要创建一个简单的函数,它使用i的冻结值返回一个新函数。 (这类似于使用TJ's bind answer

function getChangeSpeedHandler(index) {
    return function() {
        this._handleChangeSpeedSlider(index);
    }
}

for (i = 0; i < 3; i++) {
    var slider = sliderObj[i] = new SliderView();
    this.listenTo(slider, "change:value", getChangeSpeedHandler(i));
}

传递滑块视图

假设处理程序中i的值仅用于获取正确的sliderObj,则可以直接传递滑块视图。

function getChangeSpeedHandler(slider) {
    return function() {
        this._handleChangeSpeedSlider(slider);
    }
}

for (i = 0; i < 3; i++) {
    var slider = sliderObj[i] = new SliderView();
    this.listenTo(slider, "change:value", getChangeSpeedHandler(slider));
}

将事件处理委派给滑块视图

如果您想处理SliderView内的更改,它应该处理事件本身。

this.listenTo(this.model, 'change:value', this.onValueChange);

触发自定义事件

如果真的是父母需要知道滑块并且他们的数字是动态的,您可以将i值传递给SliderView然后它可以触发自定义事件。

在滑块视图中:

var SliderView = Backbone.View.extend({
    initialize: function(options) {
        options = options || {};
        this.index = options.index;
        // ...
    },
    onValueChange: function(model, value, options) {
        this.trigger('slider:change', value, this.index, this);
    },
});

然后在父母:

initialize: function() {
    for (i = 0; i < 3; i++) {
        var slider = sliderObj[i] = new SliderView({ index: i });
        this.listenTo(slider, "slider:change", this._handleChangeSpeedSlider);
    }
},
_handleChangeSpeedSlider: function(value, index, sliderView) {
    // handle the change
}