我正在创建多个对象并绑定到同一个处理程序。我的要求是我想在调用时发送特定值来处理。
代码:
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。
请帮我解决这个问题。
答案 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");
}
}
}
答案 1 :(得分:1)
最简单的解决方案是将回调包装成匿名函数。
但是由于我们循环并且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
}