2012-05-24 33 views
9

我似乎无法弄清楚为什么样式属性没有得到更新。在我的大型应用程序中,它似乎工作正常。AngularJS ng样式不会随着属性发生变化

angular.module('Model', []) 
    .factory('SizeModel', function() { 
     return { 
      width: 200, 
      height: 100, 
      display:"block", 
      getCombined: function() { 
       return parseInt(this.width) + parseInt(this.height); 
      } 
     }; 
    }); 

function AlbumCtrl($scope,SizeModel) { 
    $scope.master = SizeModel; 
    $scope.$watch("master",function(){ 
    $scope.myprop = { display: $scope.master.display, 
         backgroundColor: "#333", 
         width: $scope.master.width+'px', 
         height: $scope.master.height+'px', 
         color: "#FFF" 
        }; 
     }); 

} 

function AnoCtrl($scope,SizeModel) { 
    $scope.master = SizeModel; 

    $scope.toggle = function(){ 
     $scope.master.display = "none"; 
    } 
} 

function EditCtrl($scope,SizeModel) { 
    $scope.master = SizeModel; 
} 

http://jsfiddle.net/ganarajpr/C2hRa/4/

这里是一个小提琴这说明我目前所面临的问题。您会注意到,当您更改输入时,宽度和高度在div中得到更新。但风格本身似乎并没有更新。任何人都可以告诉我我在这里做错了什么?

我已经尝试了所有使用$范围在以下情况下

  1. $适用.. - 抛出一个错误,说明$已经在进行中应用..
  2. $ rootScope $应用 - 与上面相同。
  3. 在另一个控制器中监视$的服务中设置另一个变量。 - 没有看到变化。

如果有人能为我解答这个问题,那将会非常酷。如果你能告诉我为什么它没有得到更新,也会很开心。

回答

12

您已经在一次性基础上将宽度和高度值分配给myprop样式字段。所以当你改变宽度或高度时,myprop不会改变。

更改myprop值,计算它的价值,而不是一个函数...

http://jsfiddle.net/DyHHJ/

+0

再次..这解决了我分离到此上下文中的问题。我真的很想知道的是,这两种情况如何不同... – ganaraj

+0

对不起,有两种情况? –

+1

我得到了我的答案..实际上,它甚至解决了我的一些老问题:)非常感谢...对于答案:) – ganaraj

1

$scope.$watch在AlbumCtrl这只手表reference inequality,这是比较严格的经!==操作符的Javascript确定。由于您只更改对象的属性,因此对master的引用仍然相同,并且不触发$ watch。您需要将另外一个参数传递给$ watch以使用objectEquality。看到这个plunkr,这里是下面的相关代码:

$scope.$watch("master",function() { 
    $scope.myprop = { 
    display: $scope.master.display, 
    backgroundColor: "#333", 
    width: $scope.master.width+'px', 
    height: $scope.master.height+'px', 
    color: "#FFF" 
    }; 
}, true); 

第三个参数true告诉角度由angular.equals函数来确定watchExpression的不平等。它正确地确定已更新的master对象已更改,并且更新myprop

相关问题