我正在尝试使用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不再需要这些东西来让变化可见了吗?
我已经尝试了过去两天找到的所有可能方式 - 现在我需要你的帮助:)
提前感谢!!
答案 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