2014-11-04 84 views
0

假设我有一个范围,显示左侧的用户列表以及右侧当前选定用户的详细信息。Angular Directives - 知道绑定到属性的对象何时发生更改

我创建了一个用户的细节元素的指令有两个双向绑定,并用指令的对象,看起来像这样结束:

{ 
    restrict: 'E', 
    scope: { 
    user: "=" 
    }, 
    templateUrl: '...', 
    controller: function() { ...elided...} 
} 

在父HTML,我用此指令:

<user-details user="currentUser"></user-details> 

随着用户选择在左侧改变,currentUser属性被更新,这导致指令中的用户属性指向不同的对象。角手柄重新呈现在用户细节的HTML指令很好,但

(这里的问题)

假设我有工作的一些小一点的,我需要的时候显示的用户是做改变了,可能是一个应该被解析成对象的JSON字符串。

我如何知道绑定对象已更改(并且我需要重新解析)?

我曾尝试:

  • 看$ scope.user
  • 观察$ ATTR, '用户'

控制器和链接功能似乎只被调用一次。

某处我必须错过一些东西。这看起来并不像它应该离那条路很远。

+1

如果你能具体谈谈这个问题会更容易帮助,但最好的解决方案最有可能涉及更多的数据绑定。 – 2014-11-04 16:01:22

回答

1

您应该使用链接,然后看user这样的:

{ 
    restrict: 'E', 
    scope: { 
    user: "=" 
    }, 
    templateUrl: '...', 
    link: function(scope) { 
    scope.$watch('user',function(value){ 
     // Do your stuff here 
    }); 
    } 
} 

你可以看用户与功能,以及:

scope.$watch(function(){ 
    retrun scope.user; 
}, function(value){ 
    // Do your stuff here 
}); 

但那就只能消化进行更新。您可以检查documentation或搜索angularjs digest循环

编辑:

我忘了scope说法,因为我只是复制粘贴。

+0

格式化有点搞砸了,但那是我尝试过的一件事情。这是行不通的。 – 2014-11-04 16:09:39

+0

你是否将范围作为参数添加到链接函数中? – 2014-11-04 16:12:38

+0

_但那么它只会在摘要上更新_ - 你是什么意思?这两个版本在功能上是等效的。 – zeroflagL 2014-11-04 16:23:50

1

您可以用true调用$apply在链接功能作为第三个参数是这样

scope.$watch('user', function(newValue, oldValue) { 
    console.log(newValue, oldValue); 
}, true); 

这改变了“objectEquality”,使用户对象将平等,而不是为基准进行比较。

也可以单独看你的用户属性是这样的:

// suppose there is an user with age and gender properties: 

scope.$watch('user.age', function(newValue, oldValue) { 
    console.log(newValue, oldValue); 
}); 

scope.$watch('user.gender', function(newValue, oldValue) { 
    console.log(newValue, oldValue); 
}); 

// more properties to watch for ... 
+0

对我来说,关键是看名字的财产。感谢您的帮助。 – 2014-11-04 17:40:49

相关问题