dar*_*rdo 5 javascript angularjs
刚刚开始使用 AngularJS,并试图找出当控制器中的变量发生变化时监听事件的最佳实践。我让它工作的唯一方法是使用发射,如下所示。
例如:
var app = angular.module("sampleApp", [])
app.controller("AppCtrl", function($scope){
$scope.elements = [
{
name: "test"
}
]
$scope.addElement = function() {
$scope.elements.push({
name: "test" + $scope.elements.length
})
$scope.$emit('elementsChanged', $scope.elements);
}
})
app.directive('render', function() {
var renderFunc = function() {
console.log("model updated");
}
return {
restrict: 'E',
link: function(scope, element, attrs, ngModel) {
scope.$on('elementsChanged', function(event, args) {
renderFunc();
})
}
}
})
Run Code Online (Sandbox Code Playgroud)
这看起来有点奇怪,我觉得我正在反对角度的观点。我尝试在模型上安装 $watch,但这似乎不起作用。任何有关此问题的帮助将不胜感激,谢谢!
我假设您使用的是不稳定的 Angular,因为 $watchCollection 仅位于不稳定分支中。
$watchCollection(obj, listener)
Run Code Online (Sandbox Code Playgroud)
Shallow 监视对象的属性,并在任何属性发生更改时触发(对于数组,这意味着监视数组项;对于对象映射,这意味着监视属性)。如果检测到更改,则会触发侦听器回调。
执行此操作的“Angular”方法是观察指令中的属性。
<render collection='elements'></render>
Run Code Online (Sandbox Code Playgroud)
您的指令
app.directive('render', function() {
var renderFunc = function() {
console.log("model updated");
}
return {
restrict: 'E',
link: function(scope, element, attrs) {
scope.$watchCollection(attrs.collection, function(val) {
renderFunc();
});
}
}
})
Run Code Online (Sandbox Code Playgroud)
如果您在稳定的角度上执行此操作,则可以将 true 作为最后一个参数传递给scope.$watch,它将监视相等而不是引用。
$watch(watchExpression, listener, objectEquality)
Run Code Online (Sandbox Code Playgroud)
objectEquality (可选) boolean 比较对象是否相等而不是引用。
这里发生的事情是 DOM 元素上的集合属性指定我们应该监视范围内的哪个属性。$watchCollection 函数回调将在范围内的值发生变化时执行,因此我们可以安全地触发 renderFunc()。
Angular 中的事件确实不应该经常使用。您认为有更好的方法是正确的。希望这有帮助。
| 归档时间: |
|
| 查看次数: |
3364 次 |
| 最近记录: |