Я нашел функции, похожие на functools.partial
python более полезными в JavaScript:
function partial(fn) {
return partialWithScope.apply(this,
Array.prototype.concat.apply([fn, this],
Array.prototype.slice.call(arguments, 1)));
}
function partialWithScope(fn, scope) {
var args = Array.prototype.slice.call(arguments, 2);
return function() {
return fn.apply(scope, Array.prototype.concat.apply(args, arguments));
};
}
Почему вы хотите его использовать? Обычная ситуация, когда вы хотите использовать это, - это когда вы хотите привязать this
к функции к значению:
var callback = partialWithScope(Object.function, obj);
Теперь, когда вызывается обратный вызов, this
указывает на obj
. Это полезно в ситуациях событий или для сохранения некоторого пространства, потому что оно обычно делает код короче.
Currying похожа на частичную с той разницей, что функция, возвращаемая currying, принимает только один аргумент (насколько я понимаю, ).
Я обычно использую шаблон дизайна Singleton для чего-то подобного http://en.wikipedia.org/wiki/Singleton_pattern . Я сделаю основную форму, которую приложение запускает под синглоном, а затем создайте аксессоры для форм и элементов управления, которые я хочу коснуться в других областях. Другие формы могут либо получить указатель на элемент управления, который они хотят изменить, либо данные в основной части приложения, которые они хотят изменить.
Другой подход - настроить события на разных формах для обмениваться сообщениями и использовать основную форму как своего рода хаб для передачи сообщений событий из одной формы в другую в приложении.
Легко: сначала вы можете получить доступ к другой форме следующим образом: (скажем, ваша другая форма Form2
)
//in Form 1
Form2 F2 = new Form2();
foreach (Control c in F2.Controls)
if(c.Name == "TextBox1")
c.Text = "hello from Form1";
Вот и все, вы просто пишете в TextBox1
в Form2
из Form1
.
Сделать их Singleton не совсем плохая идея, но лично я бы не стал делать это именно так. Я предпочел бы передать ссылку на другую форму. Вот пример.
Form1 запускает Form2 для открытия. Form2 имеет перегруженный конструктор, который принимает форму вызова в качестве аргумента и предоставляет ссылку на члены Form2. Это решает проблему связи. Например, я обнаружил свойство Label как общедоступное в Form1, которое было изменено в Form2.
При таком подходе вы можете общаться по-разному.
Ссылка для загрузки для примера Project
// Ваша форма1
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form2 frm = new Form2(this);
frm.Show();
}
public string LabelText
{
get { return Lbl.Text; }
set { Lbl.Text = value; }
}
}
// Ваша форма2
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private Form1 mainForm = null;
public Form2(Form callingForm)
{
mainForm = callingForm as Form1;
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
this.mainForm.LabelText = txtMessage.Text;
}
}
Есть еще один способ, если вы не хотите прокручивать элементы управления «ALL», как предположил Джо Дабонс. Сделайте функцию в Form2 и вызовите ее из Form1.
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
public void SetIndex(int value)
{
lsbMyList.SelectedIndex = value;
}
}
public partial class Form1 : Form
{
public Form2 frm;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
frm=new Form2();
frm.Show();
}
private void button1_Click(object sender, EventArgs e)
{
frm.SetIndex(Int.Parse(textBox1.Text));
}
}