Javascript 在角度中更改模型后如何更新视图?
如何让Angular传播我对模型所做的更改。在AngularJS中,这真的很容易,但我似乎无法让它在AngularJS中工作。我知道整个变化检测系统和视图传播都完全改变了。不知何故,我需要通知angular这些变化。但我如何在实践中做到这一点呢 请参阅这段typescript代码:Javascript 在角度中更改模型后如何更新视图?,javascript,typescript,angular,Javascript,Typescript,Angular,如何让Angular传播我对模型所做的更改。在AngularJS中,这真的很容易,但我似乎无法让它在AngularJS中工作。我知道整个变化检测系统和视图传播都完全改变了。不知何故,我需要通知angular这些变化。但我如何在实践中做到这一点呢 请参阅这段typescript代码: import {Component, View, bootstrap, For} from 'angular2/angular2'; // Annotation section @Component({ s
import {Component, View, bootstrap, For} from 'angular2/angular2';
// Annotation section
@Component({
selector: 'app'
})
@View({
template: `
<div *for="#user of users">
{{user}}
</div>
`,
directives: [For]
})
class App {
users:Array<String>;
constructor() {
this.users = [];
this.fillUsersAsync();
}
fillUsersAsync(){
window['fetch']('http://jsonplaceholder.typicode.com/users')
.then( resp => resp.json())
.then( users => users.forEach(user => this.users.push(user.name)))
.then( () => console.log('Retrieved users and put on the model: ', this.users));
}
}
bootstrap(App);
import{Component,View,bootstrap,For}来自'angular2/angular2';
//注释部分
@组成部分({
选择器:“应用程序”
})
@看法({
模板:`
{{user}}
`,
指令:[用于]
})
类应用程序{
用户:阵列;
构造函数(){
this.users=[];
this.fillUsersAsync();
}
fillUsersAsync(){
窗口['fetch']('http://jsonplaceholder.typicode.com/users')
.then(resp=>resp.json())
.then(users=>users.forEach(user=>this.users.push(user.name)))
.然后(()=>console.log('检索用户并将其放在模型上:',this.users));
}
}
引导(App);
您将看到,在用户加载到模型中之后,视图不会更新
我使用的是SystemJS0.16,angular 2.0.0-alpha.23
(目前,仅在chrome中有效,因为使用了新的“fetch”api)要在AngularJS2中更新视图中的数据,应使用表单。你可以在这里阅读或查看更多详细信息。 如果我正确理解表单,您应该修改yout@View部分,如下所示:
@View({
template: `
<div *for="#user of users" control="users">
{{user}}
</div>
`,
directives: [For]
})
@View({
模板:`
{{user}}
`,
指令:[用于]
})
--已编辑
试试这个:
import {Component, View, bootstrap, For} from 'angular2/angular2';
// Annotation section
@Component({
selector: 'app'
})
@View({
template: `
<div [control]="users" *for="#user of users">
{{user.value}}
</div>
`,
directives: [For, forms]
})
class App {
users:Array<String>;
constructor() {
this.users = new Control([]);
this.fillUsersAsync();
}
fillUsersAsync(){
window['fetch']('http://jsonplaceholder.typicode.com/users')
.then( resp => resp.json())
.then( users =>
var usersArr = []
users.forEach(user =>
usersArr.push(user.name))
this.users = new Control(usersArr));
}
}
bootstrap(App);
import{Component,View,bootstrap,For}来自'angular2/angular2';
//注释部分
@组成部分({
选择器:“应用程序”
})
@看法({
模板:`
{{user.value}}
`,
指令:[用于,表格]
})
类应用程序{
用户:阵列;
构造函数(){
this.users=新控件([]);
this.fillUsersAsync();
}
fillUsersAsync(){
窗口['fetch']('http://jsonplaceholder.typicode.com/users')
.then(resp=>resp.json())
。然后(用户=>
var usersArr=[]
users.forEach(user=>
usersArr.push(user.name))
this.users=新控件(usersArr));
}
}
引导(App);
我不确定我的答案是否完全正确,但我找不到更多的信息。用这段代码做实验,愿原力与你同在!:)
我还发现,信息量很大
据我所知,在构造函数中,您应该通过新控件(一些数据)
初始化您的用户
变量,然后,在视图模板中,您可以像这样访问此数据-{{users.value}
如果不起作用:尝试同样的方法,但使用非常简单的数据,例如使用字符串而不是数组
并且将有助于在ng2中取消表单的接收。Ng前缀又回来了<对于Angular2版本的alpha-24+,用于的代码现在已变为ngFor
import {NgFor} from 'angular2/directives';
@View({
directives: [ngFor]
})
然后在模板中使用*ng for=#user of users“
签出或我发现了问题。显然,这是alpha 27中需要修复的错误。请参阅此错误报告: Angular2使用zonejs知道何时开始摘要周期(脏检查和更新视图)。到目前为止,在使用新窗口获取数据后不会触发zonejs。fetch() 将窗口['fetch']行替换为该行修复了我的问题:
Zone.bindPromiseFn(窗口['fetch'])('http://jsonplaceholder.typicode.com/users)
刚才在这里回答了
基本上,Beta 2.0.0-Beta.1中有一个bug
希望有帮助!您的第二个链接似乎让我走上了正确的道路,但文档似乎过时了。我想我需要在指令数组中使用某种形式的指令,但名称是什么,以及如何导入它?@nicojs建议按照第一个链接的示例进行操作,如果它不起作用,请使用第二个。指令名称对于
表单
-指令:[forms]或[forms]。像导入[for]一样导入它指令。请尝试这个并报告,我试图帮助你更多。我尝试了所有方法,但都不起作用。我认为我们看错了方向。据我所知,angular2仍然使用脏检查来查看模型是否更改。不知何故,我需要通知angular2我更新了模型。或者使用$http等效工具。我认为我们错过了一些东西。。。它必须与[控制]一起工作语句。我在几分钟内编辑了我的答案。请检查它。问题不在于,它工作正常。这就是我指定使用alpha-22的原因。但在angular2评估视图时,用户数组仍然为空。问题是,在获取完成后,angular2没有被通知模型中的更改。到目前为止我知道,盎格鲁2不使用Objut.Vistor,但仍然使用脏检查来检查变化。因此它不知道视图中的变化。在角1。x中,您将使用$HTTP,甚至$Apple。是否有一个角2等价物?用alpha代码,您可能需要考虑坚持最新版本,以避免更多的bug和不完整。功能。在Angular2中没有$apply,也没有必要,视图应该根据模型进行更新。您可以使用ng2中的任何请求方法而不是$http。请参阅Angular2的创建者。好的,不需要$apply。但是必须有某种方法通知更改检测我的更改。它不会轮询,也不会使用Object.observe.那么如何解决这个问题呢?实际上有:\ngZone.run()
。请参阅