2

我创建了一个 AngularJS 指令来为 Google 地图自动完成包装一个 Geocomplete 插件。我正在尝试使其绑定到范围的属性,该属性是通过向现有元素添加“geocomplete”属性来指定的。

    geocompleteModule.directive("geocomplete", function ($log, $timeout, $compile, $controller) {
        return {
            restrict: 'A',
            priority: 200,
            link: function (scope, element, attrs, ctrl) {
                var autocomplete = $(element).geocomplete().bind("geocode:result", function (event, result) {
                    if(result.geometry && result.geometry.location) {
                        var location = result.geometry.location;
                        scope.$apply(function (s) {
                            s[attrs.geocomplete] = new Models.Point(location.lat(), location.lng());
                        });
                    }
                });
            }
        };
    });

但是,如果 geocomplete 属性中引用的属性是子属性,这将不起作用。例如:

<input geocomplete="location" />

作品。

<input geocomplete="search.location" />

不管用。

原生地,AngularJS 似乎能够用它自己的绑定来做到这一点,但我将如何自己去实现呢?

编辑

我知道如何使用 split 和 for 循环来完成此操作,但大概这不是“正确”的方式。

4

2 回答 2

2

对于您的指令,我只能看到两个更改。添加范围,将 geocomplete 属性上的任何值绑定到“位置”,然后在您的范围中使用 s[scope.location]。$apply

指令文档:http ://docs.angularjs.org/guide/directive

geocompleteModule.directive("geocomplete", function ($log, $timeout, $compile, $controller) {
 return {
    restrict: 'A',
    scope:{
      location:'=geocomplete'  
    },
    priority: 200,
    link: function (scope, element, attrs) {
        var autocomplete = $(element).geocomplete().bind("geocode:result", function (event, result) {
            if(result.geometry && result.geometry.location) {
                var location = result.geometry.location;
                $timeout(function() {
                    scope.location = new Models.Point(location.lat(), location.lng());
                });
            }
        });
    }
 };
});
于 2012-11-12T21:10:02.227 回答
0
s[attrs.geocomplete] = new Models.Point(location.lat(), location.lng());

替换为:

var a = function(){};
var s = [];

s.push( { 'attr' : 'aaa.bbb', 'method' : new a() } );
于 2012-11-12T15:59:36.980 回答