2015-04-07 72 views
3

这里有一个plunker演示问题:http://plnkr.co/edit/1ceWH9o2WNVnUUoWE6Gm通过jQuery添加NG-style属性,角度不更新

代码:

var app = angular.module('myApp', []); 
app.controller('myCtrl', function($scope) { 
    console.log('yeah'); 
    var header = $('#weird'); 
    console.log(header); 
    header.attr("ng-style", "{'background-color' : 'red'}") 
}); 

它添加了NG-style属性,但角度不知道关于它,所以它从来没有应用。

这是我想要做的简化版本,我试图在chessboard.js生成的国际象棋棋盘中的每个方块中添加一个ng样式的属性。我这样做是通过将ng样式属性添加到编译函数中的每个方块,就像我将ng样式属性添加到标头一样。如果有更好的方法来做到这一点,我很想知道它。如果不是,那么添加ng样式属性时如何才能更新角度?

我读过关于$scope$digest$apply,我试过和他们一起玩,但一直没弄明白。什么是实现这一目标的最佳方式?

+0

DOM操作应该在指令链接函数而不是控制器中处理。另外指令元素固有地使用jquery lite。我建议调查一下。 – Dom

+0

我已经将它移入链接函数,但不幸的是仍然存在同样的问题。我不认为用jQuery lite代替jQuery会改变任何东西。 –

+0

这是错误的做法。添加ngStyle并将其绑定到条件espression。你不应该动态添加属性 – pixelbits

回答

2

这取决于指令究竟如何工作的,但在ngStyle情况下,你可能需要重新编译元素:

app.controller('myCtrl', function($scope, $compile) { 
    console.log('yeah'); 
    var header = $('#weird'); 
    console.log(header); 
    header.attr("ng-style", "{'background-color' : 'red'}"); 
    $compile(header)($scope); 
}); 

$apply当角与纯JS/jQuery的混合通常提出,但它只有在作用域绑定需要更新时才有意义,事实并非如此。此外,当异步回调函数发生时,它是有意义的,但是在控制器构造函数中发生的范围变化被应用(没有魔术区分角度和非角度的东西,所以'$ apply already already progress'出现,如果你触发当你不需要时摘要)。

我假设你故意使用jQuery,并且我可以为你省去'角色恨 - jquery-selectors-bad-bad-you-re-doing-it-wrong'单调乏味。