范围变量更改时更改指令

时间:2016-12-26 12:37:10

标签: javascript angularjs

我正在使用http请求从json文件中获取数据,而不是在控制器中使用。

    app.controller('mainCtrl', ['$scope', 'loaderService', function ($scope, loaderService) {
   //gets data from service 
        loaderService.getLoadedHtml().then(function (result) {
            $scope.fields = result.data;
        });
    }]);

$scope.fields更改为

时,我需要更新指令
app.directive('dform', function () {
    return {
        scope: {
            action: '@',
            method: '@',
            html: '='
        },
        link: function (scope, elm, attrs) {
            var config = {
                "html": scope.fields
            };

            scope.$watch('fields', function (val) {
                elm.dform(config);
            });

            //console.log(config);
            //elm.dform(config);
        }
    };
})

以下是我使用此指令的方法

<div html="fields" dform></div>

但在我的情况下,当$ scope.fields发生变化时,我在我的指令$ watch函数中得到scope未定义。

问题:

如何在范围内获取scope.fields的更新值。$ watch function?

3 个答案:

答案 0 :(得分:2)

您需要通过为其添加绑定来赋予protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e) { string commandArgument = e.CommandArgument.ToString(); if (e.CommandName == "img") { Response.Write("event is fired: " + commandArgument); } else if (e.CommandName == "btn1") { Session["id"] = commandArgument; } } 指令访问权限:

ionViewDidLoad(){
   this.platform.ready().then((readySource) => {
       this.pps.getSummary(); //pps is a provider named ProdPerfService
   });
}

和HTML:

fields

第一次价值可能是scope: { action: '@', method: '@', html: '=', fields: '=' } ,那么您不想拨打<dform fields="fields" ...

undefined

更新

使用此HTML:

dform

您只需要scope.$watch('fields', function(newValue, oldValue) { if (newValue === oldValue) return; var config = { "html": newValue }; elm.dform(config); }); ,而无需<div html="fields" dform></div> 或添加html作为约束:

$parent

答案 1 :(得分:1)

通常对于应尽可能透明的指令,不应使用新的范围。拥有新范围还可以防止其他指令在同一元素上请求新范围。

如果只有一个属性应该是动态的,那就像

一样简单
scope: false,
link: function (scope, elm, attrs) {
    scope.$watch(function () { return scope[attrs.html] }, function (val) {
        if (val === undefined) return;

        var config = {
            action: attrs.action,
            method: attrs.method,
            html: val
        };

        elm.dform(config);
    });

}

或者,bindToController可用于更现代,面向未来的方式(取决于html会发生什么,$scope.$watch可以进一步升级到self.$onChanges挂钩)

scope: true,
bindToController: {
    action: '@',
    method: '@',
    html: '='
},
controller: function ($scope, $element) {
    var self = this;

    $scope.$watch(function () { return self.html }, function (val) {
        if (val === undefined) return;

        var config = {
            action: attrs.action,
            method: attrs.method,
            html: val
        };

        $element.dform(config);
    });
}

考虑到html="fields",上面的代码会关注fields范围属性。

答案 2 :(得分:0)

使用$parent.fields代替fields