如何访问嵌套函数的嵌套对象信息

时间:2014-07-23 17:17:50

标签: javascript angularjs object

我正在Angular中编写一个应用程序,有类似的东西:

$scope.items = [
    {'name':'someName',
    'title': 'someTitle',
    'filter': function(item){
        Filters.setTableTitle(this.title); //cannot get title
        ...
        }
    },
    {'name':'someName',
    'title': 'someTitle',
    'filter': function(item){
        Filters.setTableTitle(this.title);
        ...
        }
    }
];

一组对象。每个对象的一部分是一个函数,在函数内部我想调用一个函数来抓取该对象本身的标题,以便将其传递给应用程序其余部分的更大范围。

但是,我无法获取每个对象的标题。

我如何访问标题才能在此处使用?

感谢。

更新

这是我的HTML使用(非常类似于)上面的代码。我正在使用代码创建按钮。

<p ng-repeat="link in items">
    <block class="button" href="{{link.URL}}" title="{{link.title}}">
        <a class="hrefLink" href="{{link.URL}}" ng-click="Filters.setFilter(link.filter, link.title)">
            {{link.name}}
        </a>
    </block>
</p>

每个对象的filter部分中保存的函数返回的信息随后会传递到更新DOM的Filters.setFilter()

Filters.setFilter()

service.setFilter = function(filter, title){
    service.searchTerm = '';
    $spMenu.hide(); //close nav if open
    service.selectedFilter = filter;
    service.setTableTitle(title); //this does the job
};

我已经重新安排了这些功能的工作方式,现在只需将标题传递给不同的功能。这可以完成我想要的工作,但仍然无法解决手头的初始问题 - 如何从对象内部访问对象的一部分?

1 个答案:

答案 0 :(得分:0)

我不太了解Angular,所以肯定会有更好的灵魂。

如果您自己调用此函数,请按以下方式编写:

$scope.items[x].filter(item);

如果它在其他地方被调用且this没有包含正确的对象,您可以枚举所有对象并将函数绑定到它:

for (var i = 0; i < $scope.items.length; ++i) {
  var item = $scope.items[i];
  item.filter = item.filter.bind(item);
}

编辑:

你有两个选择。首先,您可以在HTML中绑定函数:

<p ng-repeat="link in items">
    <block class="button" href="{{link.URL}}" title="{{link.title}}">
        <a class="hrefLink" href="{{link.URL}}" ng-click="Filters.setFilter(link.filter.bind(link))">
            {{link.name}}
        </a>
    </block>
</p>

或者您可以编辑功能为您执行此操作:

<p ng-repeat="link in items">
    <block class="button" href="{{link.URL}}" title="{{link.title}}">
        <a class="hrefLink" href="{{link.URL}}" ng-click="Filters.setFilter(link)">
            {{link.name}}
        </a>
    </block>
</p>

service.setFilter = function(link){
    service.searchTerm = '';
    $spMenu.hide(); //close nav if open
    service.selectedFilter = link.filter.bind(link);
};