我已经在这个问题上读线程,如: 视图不更新AngularJS ,但我仍然无法理解如何应用它在我的简单的例子。
我有这样的功能:
function MyPageView($scope) {
var myModel = new MyModel();
$scope.myModel = myModel;
}
当myModel
在代码中(当用户点击,交互,发送XHR请求),在其他地方更新它不更新我的看法。 我明白我需要做一些与$申请,但我不明白的地方,以及如何。
谁能向我解释我该如何解决这个问题,这个简单的用例?
我的模型看起来是这样的(如果有必要的问题) - 它有它里面没有AngularJS代码:
var MyModel = function() {
var _this = this;
...
_this.load = function(){...};
_this.updateModel = function(){...};
...
return _this;
}
添加的jsfiddle例如: http://jsfiddle.net/DAk8r/2/
你的问题的关键是,你试图用一个非常传统的,“jQuery的汤式”的JavaScript模式混合AngularJS。 - 在角度,你应该总是使用指令做DOM操作和交互(包括点击次数)。 在这种情况下,你的代码应该看起来更像如下:
<div ng-controller="myModelCtrl">
<div>Number is {{myModel.number}}</div>
<a ng-click="myModel.updateNumber()">Update Number</a>
</div>
function myModelCtrl($scope) {
var myModel = new MyModel();
$scope.myModel = myModel;
}
function MyModel() {
var _this = this;
_this.number = 0;
_this.updateNumber = function() {
_this.number += 1;
alert('new number should display ' + _this.number);
}
return _this;
}
请注意,而不是建立一个手册如何, click
使用jQuery处理程序,我们使用角度的内置ng-click
指令。 这让我们在配合于角范围的生命周期,并正确,当用户点击链接更新视图。
下面是从报价AngularJS常见问题 ; 我加粗,可以帮助你打破习惯的一部分。
常见缺陷
该角支撑通道(Freenode上#angularjs)看到许多重复的缺陷在于角落入的新用户。 该文件旨在你发现他们艰难地前点出来。
DOM操作
停止尝试使用jQuery修改DOM的控制器。 真。 这包括添加元素,移除元素,检索其内容,显示和隐藏它们。 使用内置的指令,或写自己在必要时,做你的DOM操作。 可以看看下面的复制功能。
如果你正在努力打破这个习惯,可以考虑从应用中删除的jQuery。 真。 角有$ http服务和强大的指令,使得它几乎总是必要的。 角的捆绑jQLite有书面角指令,特别是结合事件中最常用的功能了一把。
最后,在这里你的榜样,使用这种技术的工作: http://jsfiddle.net/BinaryMuse/xFULR/1/
http://jsfiddle.net/zCC2c/
你的问题是双重的。
1)在你的jsfiddle语法错误,如DOMElements(如一个由$返回(这个)你的函数clickhandler里没有阻止默认值。实际上,你需要通过一个事件。(小的语法问题)。
2)通过将控制器的范围,像这样在您的变量定义:
function MyCtrl($scope){
$scope.foo = foo;
}
你保证它得到每类实例化运行一次。
你想要的是:
function MyCtrl($scope){
$scope.someAngularClickHandler=function(){
$scope.foo = foo;
}
}
然后你的链接
<a href="foo" id="bar" ng-click="someAngularClickHandler()">
为了更详尽codesample查看链接的jsfiddle。
该理论的一个很好的概述可以在这里先说说发现:
http://www.youtube.com/watch?feature=player_embedded&v=VxuN6WO3tIA
在角应用程序,模型通常有时$范围实施,而不是作为一个独立的JavaScript对象。 这是你的应用程序中显示了如何做一个重写
function myModelCtrl($scope) {
$scope.number = 0;
$scope.updateNumber = function () {
$scope.number += 1;
alert('new number should display ' + $scope.number);
}
}
HTML:
<div ng-controller="myModelCtrl">
<div>Number is {{number}}</div>
<a ng-click="updateNumber()">Update Number</a>
</div>
这里有一个小提琴 ,没有jQuery的,它显示了建立捣鼓角的“正常方式”。