在您使用控制器作为语法( Style Y032 )观看的示例中,您没有明确说明您将控制器与其视图耦合,因为您的代码段仅在您的视图中有SomeController as vm
时才有效。
对我来说,这是使用整个控制器作为语法的缺点。 你可以使用 $scope.watch 的函数符号来解决这个问题,或者使用你当前的方法写一些关于问题的东西。
PR如果你喜欢
那么你认为我应该使用controller as
和$scope.$watch
来写问题,还是应该引入像这样的函数符号
$scope.$watch(function () {
return vm.title;
}, function(current, original) {
$log.info('vm.title was %s', original);
$log.info('vm.title is now %s', current);
});
替换旧示例还是应该比较两者?
如果我理解你的结构,我会比较两者并使用你的避免和推荐的语法。
呜呜呜。 在控制器内部观察反模式。 在这个例子中你真的不需要它; 最好添加更改事件绑定(我相信这就是您在 Ng2 中要做的事情)。
我更希望这个讨论成为“ControllerAs”的一个子部分,它首先敦促人们避免在控制器内部观看。 然后,“如果你必须”,我只会使用@Jandalf版本,并且不会对评估 'vm.title' 表达式的风险做出太大的处理。 只需说:“这样做”。
你怎么看这个预览:
注意:创建监视时要谨慎,因为它们会为摘要循环增加更多负载。 请改用ngChange
。
$scope.$watch
的函数符号来观察变化_Why?_:控制器可以绑定到另一个值然后vm
因此,如果您确实需要观看值,请使用以下模式:
<input ng-model="vm.title"/>
function SomeController($scope, $log) {
var vm = this;
$scope.$watch(function () {
return vm.title;
}, function(current, original) {
$log.info('vm.title was %s', original);
$log.info('vm.title is now %s', current);
});
}
嗯嗯
必须明确的是,应该避免在控制器中观看。 改用 ngChange。 或将手表移至指令。 想法?
然后是关于如何将 watch 与 controllerAs 一起使用的新规则,它会替换或更新我在那里的内容。
同意你的看法,约翰。
应该避免在控制器中使用 watch 并且首选监听更改事件或编写指令还不够清楚。 这个建议也应该有一个“为什么”(为什么控制器中的手表不好)
关于如何做的建议_如果你必须_应该是单独的点,并且应该从重复的强烈警告开始。
然后我想看看我为什么要这样做的案例。 我在这里没有看到。 实在想不出一个。 你是否可以?
如果没有这样的例子,我根本不愿意包含这个建议。
此外,本文中的“为什么”让我感到困惑。 这是避免依赖“vm”名称的特定技术的“为什么”。 这是真正原因的次要原因,这就是为什么你会在控制器中观看。 只有在前面有“不要这样做”的例子时才有意义。
需要做更多的工作,但我认为是必要的。
建议任何人?
我认为这总结了讨论
避免使用 $scope.$watch。 改用 ng-change 或自定义指令。
_Why?_:手表更难测试,而且它们对性能也不利,因为它们在每个 $digest 循环中进行评估。
/* avoid */
function SomeController($scope) {
var vm = this;
$scope.$watch(function () {
return vm.title;
}, doSomething);
function doSomething() {
}
}
<!-- recommended -->
<input type="text" ng-model="vm.title" ng-change="vm.doSomething()"/>
/* recommended */
function SomeController() {
var vm = this;
vm.doSomething = doSomething;
function doSomething() {
}
}
您是否使用 controllerAs 记录指令中的 $watch? 你能推荐一个链接或资源吗?
有人有兴趣做 PR 吗?
清理我的旧问题
最有用的评论
我认为这总结了讨论
控制器作为 $watch
[样式[Y999](#style-y999)]
避免使用 $scope.$watch。 改用 ng-change 或自定义指令。
_Why?_:手表更难测试,而且它们对性能也不利,因为它们在每个 $digest 循环中进行评估。