【问题标题】:How to access nested object info for nested functions如何访问嵌套函数的嵌套对象信息
【发布时间】:2014-07-23 17:17:49
【问题描述】:

我正在用 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
};

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

【问题讨论】:

  • 这可能不是一个好主意。你可以不做服务或工厂吗?使其成为服务/工厂将允许您轻松注入其他可能在未来有用的服务/工厂。例如 localStorageService...
  • 你的html代码是什么样子的?是否在 ng-repeat 中?
  • 这用于通过 ng-repeat 生成一些按钮。单击按钮时会调用过滤器函数,该按钮不会加载新视图,而是更改过滤器并重新排列相应的表格。此信息本身不需要超出其控制器,但我正试图将标题从这里获取到工厂,以便可以在其他地方使用。 (试图将它传递到我的过滤器工厂。)
  • 我已经用我的 HTML 代码更新了这个问题。
  • Filters.setFilter 函数包含什么?

标签: javascript angularjs object


【解决方案1】:

我不太了解 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);
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多