Angularjs 监视在控制器上触发,但不是指令
我有一个监视绑定的指令,奇怪的是,如果立即更改变量,则监视会关闭,但如果它等待http调用返回,则不会触发监视。 奇怪的是,它会触发控制器的监视,但不会触发指令监视,即使它们基本上在同一个监视器上 下面是一些描述该问题的代码片段。 指令:Angularjs 监视在控制器上触发,但不是指令,angularjs,Angularjs,我有一个监视绑定的指令,奇怪的是,如果立即更改变量,则监视会关闭,但如果它等待http调用返回,则不会触发监视。 奇怪的是,它会触发控制器的监视,但不会触发指令监视,即使它们基本上在同一个监视器上 下面是一些描述该问题的代码片段。 指令: .directive('afcAutocomplete', function() { return { restrict: 'AEC', scope: { binding: '=ngModel', source: '=',
.directive('afcAutocomplete', function() {
return {
restrict: 'AEC',
scope: {
binding: '=ngModel',
source: '=',
filter: '=?',
[...]
},
templateUrl: '/afc_template/afc-autocomplete.html',
controller: function($scope, $element, $attrs, $compile, $timeout) {
[...]
$scope.$watch('binding', function(newValue) {
console.log('new val: ', newValue);
setDisplayBinding(newValue);
});
[...]
根控制器:
app.controller("editController", function($scope, $http, $routeParams) {
if($routeParams.id)
qDocument = editFormUtility.load($routeParams.id, $routeParams.document_type); //returns a $http call to an API
else {
qDocument = {
header: {
id: guid(),
schema : $routeParams.document_type,
languages: ["en"]
},
government: $scope.userGovernment() ? { identifier: $scope.userGovernment() } : undefined,
};
[...]
app.controller("editMeasure", function ($scope) {
$controller('editController', {$scope: $scope});
$scope.$watch('document.government', function() {
if($scope.document)
console.log('government changed: ', $scope.document.government);
});
[...]
控制器:
app.controller("editController", function($scope, $http, $routeParams) {
if($routeParams.id)
qDocument = editFormUtility.load($routeParams.id, $routeParams.document_type); //returns a $http call to an API
else {
qDocument = {
header: {
id: guid(),
schema : $routeParams.document_type,
languages: ["en"]
},
government: $scope.userGovernment() ? { identifier: $scope.userGovernment() } : undefined,
};
[...]
app.controller("editMeasure", function ($scope) {
$controller('editController', {$scope: $scope});
$scope.$watch('document.government', function() {
if($scope.document)
console.log('government changed: ', $scope.document.government);
});
[...]
editMeasure模板:
<div afc-autocomplete ng-model="document.government" source="ac_countries" filter="genericFilter"></div>
让我困惑的是,如果我开始一个新文档,那么手表就可以工作,但是如果我编辑一个文档,它通过$http调用,那么控制器手表仍然可以工作,但是指令手表不工作。在控制台日志方面,我看到“document:”,然后“government changed”作为最后一条消息,因此在“document:”log之后没有“new val:”消息,这是我们更改文档的指示器。
另一张纸条。文档最初未定义,然后变成一个对象,将“government”设置为另一个对象,类似于{id:'ca'}。感谢Vaidik帮助我找到答案 问题是,如果手表是在当前未定义的绑定上创建的,那么当您设置它时,它将无法工作。因此,您需要确保绑定被设置为某种东西,任何东西 在我的例子中,我设置了$scope.document={},然后绑定工作了
Angular是一种怪兽。有人能在评论中解释为什么设置$scope.document={}会让我对$scope.document.government的监视突然起作用,即使我最终完全替换了分配给$scope.document的对象(我给它一个全新的对象,我不只是设置属性)?我很困惑,因为您不可能使用常规引用来实现这一点,因为我正在为$scope.document设置一个新引用,因此Angular正在做一些其他神奇的事情,我觉得了解它在做什么可以帮助我解决未来的问题。尝试在一个环境中重新创建,或者您可以确保在指令的控制器中应用
$watch
时,定义了绑定
?因为如果它没有被定义为控制器中未定义的文档
的结果,那么这将是一个问题,$watch
将无法工作。哥们,你太棒了!我在控制器中首先将$scope.document设置为{},现在它可以工作了!