Ниже приведено решение.
function callbackfunction(){
window.angularComponent.runThisFunctionFromOutside();
}
<script>
System.config({
transpiler: 'typescript',
typescriptOptions: { emitDecoratorMetadata: true },
packages: {'js/app': {defaultExtension: 'ts'}}
});
System.import('js/app/main')
.then(null, console.error.bind(console));
</script>
My App.component.ts
import {Component NgZone} from 'angular2/core';
import {GameButtonsComponent} from './buttons/game-buttons.component';
@Component({
selector: 'my-app',
template: ' blblb'
})
export class AppComponent {
constructor(private _ngZone: NgZone){
window.angularComponent = {runThisFunctionFromOutside: this.runThisFunctionFromOutside, zone: _ngZone};
}
runThisFunctionFromOutside(){
console.log("run");
}
}
Ах ха момент для меня для шаблона "наблюдатель" должен был понять, насколько тесно связанный это с событиями. Рассмотрите Windows-программу, которая должна достигнуть свободно связи между двумя формами. Это может легко быть выполнено с шаблоном "наблюдатель".
Код ниже шоу, как Form2 запускает событие и любой другой класс, зарегистрированный как наблюдатель, получает свои данные.
См. эту ссылку для большого ресурса шаблонов: http://sourcemaking.com/design-patterns-and-tips
Код Form1:
namespace PublishSubscribe
{
public partial class Form1 : Form
{
Form2 f2 = new Form2();
public Form1()
{
InitializeComponent();
f2.PublishData += new PublishDataEventHander( DataReceived );
f2.Show();
}
private void DataReceived( object sender, Form2EventArgs e )
{
MessageBox.Show( e.OtherData );
}
}
}
Код Form2
namespace PublishSubscribe
{
public delegate void PublishDataEventHander( object sender, Form2EventArgs e );
public partial class Form2 : Form
{
public event PublishDataEventHander PublishData;
public Form2()
{
InitializeComponent();
}
private void button1_Click( object sender, EventArgs e )
{
PublishData( this, new Form2EventArgs( "data from form2" ) );
}
}
public class Form2EventArgs : System.EventArgs
{
public string OtherData;
public Form2EventArgs( string OtherData )
{
this.OtherData = OtherData;
}
}
}
Цепочка шаблона Ответственности реализована в обработке событий DOM. Например, (и упрощение немного), когда на элемент нажимают, тот элемент получает первую возможность обработать событие и затем каждого предка у крачки, пока высокоуровневый документ не достигнут, или один из них явно останавливает событие, "пузырящееся" дальше.
Используйте code.google.com
Например, результат поиска для "Фабрики" получит Вас много случаев, где шаблон "фабрика" реализован.
Составной объект используется экстенсивно в UI. Компоненты могут быть листовыми компонентами, например, кнопками и маркируют или составляют композит, например, панели, которые могут содержать другой лист или составить компоненты. С точки зрения клиента все компоненты рассматривают то же, которое значительно упрощает клиентский код.
Если Вы знакомы с Python, проверяете Скрученную платформу. http://twistedmatrix.com/trac/
C#, Java и Python имеют стандартную реализацию шаблона Итератора. В C# и Python это межтерлось на языке, таким образом, можно просто использовать операторы возврата урожая.
Я использую пассивное представление, разновидность Образцового шаблона Предъявителя Представления, с любыми веб-формами как разработка (.NET) для увеличения тестируемости/пригодности для обслуживания/и т.д.
Например, Ваш код - позади файла мог бы выглядеть примерно так
Partial Public Class _Default
Inherits System.Web.UI.Page
Implements IProductView
Private presenter As ProductPresenter
Protected Overrides Sub OnInit(ByVal e As System.EventArgs)
MyBase.OnInit(e)
presenter = New ProductPresenter(Me)
End Sub
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
presenter.OnViewLoad()
End Sub
Private ReadOnly Property PageIsPostBack() As Boolean Implements IProductView.PageIsPostBack
Get
Return Page.IsPostBack
End Get
End Property
Public Property Products() As System.Collections.Generic.List(Of Product) Implements Library.IProductView.Products
Get
Return DirectCast(gridProducts.DataSource(), List(Of Product))
End Get
Set(ByVal value As System.Collections.Generic.List(Of Product))
gridProducts.DataSource = value
gridProducts.DataBind()
End Set
End Property
End Class
Этот код позади действует как очень тонкое представление с нулевой логикой. Эта логика вместо этого продвинута в класс предъявителя, который может быть протестированной единицей.
Public Class ProductPresenter
Private mView As IProductView
Private mProductService As IProductService
Public Sub New(ByVal View As IProductView)
Me.New(View, New ProductService())
End Sub
Public Sub New(ByVal View As IProductView, ByVal ProductService As IProductService)
mView = View
mProductService = ProductService
End Sub
Public Sub OnViewLoad()
If mView.PageIsPostBack = False Then
PopulateProductsList()
End If
End Sub
Public Sub PopulateProductsList()
Try
Dim ProductList As List(Of Product) = mProductService.GetProducts()
mView.Products = ProductList
Catch ex As Exception
Throw ex
End Try
End Sub
End Class
Шаблонный шаблон является наиболее часто используемым в реализации dotnet событий, чтобы настроить предварительные условия и ответить на постусловия. Вырожденный случай
void FireMyEvent(object sender, EventArgs e)
{
if (_myevent != null) _myEvent(sender, e);
}
в котором проверяется предварительное условие. В этом случае предварительное условие - то, что обработчики могут быть вызваны только, когда по крайней мере один был связан. (Не говорите мне, что я должен вызвать обработчики асинхронно. Я знаю это. Я иллюстрирую Шаблонный шаблон, не метод асинхронного программирования.)
Более тщательно продуманное предварительное условие могло бы включить проверку свойства, которое управляет увольнением событий.
Шаблонный шаблон является также наиболее часто используемым для реализации рычагов, например
public virtual void BeforeOpenFile(string filepath)
{
//stub
}
public virtual void AfterOpenFile(string filepath)
{
//stub
}
public sealed void OpenFile(string filepath)
{
BeforeOpenFile(filepath); //do user customisable pre-open bits
//do standard bits here
AfterOpenFile(filepath); //do user customisable post-open bits
}
Шаблон "команда" используется везде, у Вас есть функциональность Отмены.
Возможно, хорошим примером, как указано в Шаблонах проектирования Head First , также является JAVA Swing API , который реализует Observer шаблон. В частности, JButton (или суперкласс AbstractButton) является классом Observable и предоставляет методы для добавления и удаления «наблюдателей» или «слушателей», как они называются в Swing.