Angular 2组件与对象的双向数据绑定

时间:2016-01-16 15:31:23

标签: angular semantic-ui angular2-directives

我正在尝试使用Angular 2测试版,并希望将Semantic UI Dropdown控件用作Angular 2组件。

http://semantic-ui.com/modules/dropdown.html#converting-form-elements

我的小样本项目在这里:

https://github.com/uNki23/angular2semantic/

我将它包装在Angular 2组件'UiSelectComponent'中,如您所见:

https://github.com/uNki23/angular2semantic/blob/master/src/app/components/ui-select.component.ts

任何其他组件都应该使用UiSelectComponent传递两个对象:一个包含可能选项的数组和一个可选的预定义选择选项。我为选择'SelectOption'创建了一个界面,它有两个属性'value'(数字)和'displayValue'(字符串)。组件应该像这样使用:

https://github.com/uNki23/angular2semantic/blob/master/src/app/components/app.component.html

第一个问题: 我想要实现的是,将预先选择的选项传递给UiSelectComponent,用户选择更改该选项该选项还应该从父组件更改所选对象。很明显,父组件需要知道UiSelectComponent中所选的选项是什么,对吗?

第二个问题: 如果我将.dropdown()函数包装在setTimeout()函数中,那么在语义ui下拉列表中设置初始选择的选项就可以了。我想,Angular 2不再需要这些东西来让变化可见了吗?

我已经尝试了过去两天找到的所有可能方式 - 现在我需要你的帮助:)

提前感谢!!

2 个答案:

答案 0 :(得分:3)

第一个问题:您可以使用输出(EventEmitter)属性,并在更改子项中的内容时向父项发出事件。您的父模板需要侦听此事件:<child (someChildEvent)="myCallback()" ...>

但是,如果您要共享的选项数据位于您传递给孩子的对象_ {1}}内,则父级和子级都会引用相同/一个<child [someChildProperty]="sharedObj" ...> ,因此您在子级中所做的任何更改都在父级中可见。 EventEmitter可能是更好的选择,因为当发生更改时您实际上可以通知父级...但事件实际上不必传递任何值,因为父级已经可以看到对{{{ 1}}。

第二个问题:我没有查看您的代码,但您可能需要超时,因为您可能需要等待第三方组件呈现或完成初始化。

答案 1 :(得分:3)

由于在特定意义上Angular 2中没有双向数据绑定,因此您必须明确地传播更改。

EventEmitter choice更改<child>时,您会使用<child (selectedChange)="doSth()">发出事件。然后,任何父组件都可以使用事件绑定语法public class MaxKSubstring { public static void main(String[] args) { String INPUT = "testingwithtees"; char C = 't'; int K = 1; int count = subStrMaxC(INPUT, C, K); System.out.println(count); } public static int subStrMaxC(String s, char c, int k) { char letters[] = s.toCharArray(); int valid = 0; List<Candidate> candidates = new ArrayList<Candidate>(); for (int i=0; i< s.length(); i++) { if (letters[i] == c) candidates.add(new Candidate(k, c)); for (Candidate candidate : candidates) { if (candidate.addLetter(letters[i])) { System.out.println(candidate.value); valid++; } } } return valid; } } class Candidate { final int K; final char C; public Candidate(int k, char c) { super(); K = k; C = c; } boolean endsWithC = false; String value = ""; int kValue = 0; public boolean addLetter(char letter) { endsWithC = false; value = value+letter; if (letter == C) { kValue++; endsWithC = true; } return endsWithC && kValue <= K+2 && value.length() > 1; } }

以声明方式订阅该事件

这是一个有效的工作:http://plnkr.co/edit/2SsgStP3P4DNgXEES8c8?p=preview