Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs $watch中未定义的作用域_Angularjs_Angularjs Directive_Angularjs Scope - Fatal编程技术网

Angularjs $watch中未定义的作用域

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:

我有一个名为dir的指令,其中包含:

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"/>