未定义范围到$ watch

时间:2013-09-27 17:22:09

标签: angularjs angularjs-directive angularjs-scope

我有一个名为 dir 的指令:

ng-model="job.start_date"

comparison-date="job.end_date

进入scope.$watch("comparisonDate...我想访问我的ng-model值。问题是范围未定义为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"/>

3 个答案:

答案 0 :(得分:1)

在指令的链接阶段,该值可能不可用。您可以使用$observe来观察值的变化。

attrs.$observe("comparisonDate", function(a) {
    console.log(scope.ngModel);
})

答案 1 :(得分:1)

ng-model是内置指令,它告诉Angular执行双向数据绑定。 http://docs.angularjs.org/api/ng.directive:ngModel

看起来您正在使用同一对象job的属性值进行比较。如果您想坚持ng-model,可以使用NgModelControllerhttp://docs.angularjs.org/api/ng.directive:ngModel.NgModelController

然后将视图更改为:

<input dir type="text" ng-model="job"/>

并将指令更改为:

.directive("dir", function() {
    return {
        require: '?ngModel', // get a hold of NgModelController
        link: function (scope, element, attrs, ngModel) {
            // access the job object
            ngModel.$formatters.push(function(job){
                console.log(job.start_date);
                console.log(job.end_date);
            });
        }
    };
})

或者您可以将属性名称从ng-model更改为某些未保留的字词。例如,将视图更改为:

<input dir type="text" comparison-start-date="job.start_date" comparison-end-date="job.end_date"/>

答案 2 :(得分:0)

尝试scope.$watch(attrs.comparisonDate, ...),然后使用attrs.ngModel