Angularjs $watch中未定义的作用域
我有一个名为dir的指令,其中包含:Angularjs $watch中未定义的作用域,angularjs,angularjs-directive,angularjs-scope,Angularjs,Angularjs Directive,Angularjs Scope,我有一个名为dir的指令,其中包含: ng-model="job.start_date" comparison-date="job.end_date 进入scope.$watch(“comparisonadate…我想访问我的ng模型值。问题是在watch的回调函数中没有定义作用域。问题是:如何在该函数中获取ng值? .directive("dir", function() { return { scope: { comparisonDate:
ng-model="job.start_date"
comparison-date="job.end_date
进入scope.$watch(“comparisonadate…
我想访问我的ng模型值。问题是在watch的回调函数中没有定义作用域。问题是:如何在该函数中获取ng值?
.directive("dir", function() {
return {
scope: {
comparisonDate: "=",
ngModel: "="
},
link: function (scope, element, attrs, ctrl) {
var foo = scope.ngModel;
scope.$watch("comparisonDate", function(value, oldValue) {
console.log(value); //comparisonDate showing value properly
console.log(scope.ngModel); //Undefined
console.log(foo) //shows value but it's not refreshing. It shows allways the initial value
})
}
};
})
景色
<input dir type="text" ng-model="job.start_date" comparison-date="job.end_date"/>
尝试
范围。$watch(attrs.comparisondata,…)
然后使用attrs.ngModel
在指令的链接阶段,该值可能不可用。您可以使用$observe
观察值的变化
attrs.$observe("comparisonDate", function(a) {
console.log(scope.ngModel);
})
ng model
是一个内置指令,告诉Angular进行双向数据绑定
看起来您正在使用同一对象的属性值job
进行比较。如果您想坚持使用ng model
,可以使用NgModelController
:
然后将视图更改为:
<input dir type="text" ng-model="job"/>
或者,您可以将属性名称从ng model
更改为一些尚未保留的单词。例如,更改视图,如:
<input dir type="text" comparison-start-date="job.start_date" comparison-end-date="job.end_date"/>
Do console.log(范围);ngModel可能包含在scope.$parent甚至scope.$parent.$parent中,具体取决于您的应用程序。您可以使用NgModelController.$modelValue
将值绑定到输入控件,并保留OP的原始标记。@MichaelBenford是的,您是对的。这样,OP的原始标记就不需要更改。但看起来有点像如果您可以使用NgModelController
访问对象,然后您需要另一个属性来获取同一对象的不同属性值,则连线。我同意您的观点,这很奇怪,但是如果OP正在实现一个通用指令,我想绑定到ng model
的属性可能与绑定到co的属性完全不同mparison date
。如果是这种情况,我认为原始标记更有意义。恐怕这是不正确的。$observe
仅适用于包含插值的属性,因此只能“观察”@
属性";要监视具有双向绑定的属性,$watch
是正确的方法。@MichaelBenford否。$observe
的目的是延迟计算。它没有理由只处理插值而不处理普通属性。的确,但它只适用于包含插值的属性。您不能使用它来监视一个绑定了=
@MichaelBenford Why?请创建一个小提琴给我看一个例子。这是出于设计。看一看:“使用$observe来观察包含插值的属性的值变化(例如src=“{bar}”)”。它根本不适用于=
属性。看到了吗
<input dir type="text" comparison-start-date="job.start_date" comparison-end-date="job.end_date"/>