【问题标题】:Angular-UI-Router modal like pinterestAngular-UI-Router 模态,如 pinterest
【发布时间】:2013-12-12 16:17:00
【问题描述】:

我正在制作一个带有画廊的应用程序,看起来很像http://pinterest.com。在 Pinterest 中,当您单击图钉时,它会在您正在查看的画廊顶部显示图钉页面。 URL 更改为 pin url,并且不包含任何有关详细信息背后的画廊的信息。您可以单击“X”或在背景上返回您正在浏览的图库而无需重新加载。

如何使用 UI-Router 复制它?

需求:

  • 在多个不同的画廊中显示相同的详细信息模式
  • 在所有情况下都切换到相同的详细信息网址
  • 如果详细信息 url 是冷输入的(通过书签或链接),只需在后面显示一个空的灰色背景并禁用关闭

谢谢!

【问题讨论】:

    标签: javascript angularjs angular-ui-router


    【解决方案1】:

    来自angular-ui-router's FAQ

    $stateProvider.state("items.add", {
        url: "/add",
        onEnter: function($stateParams, $state, $modal, $resource) {
            $modal.open({
                templateUrl: "items/add",
                resolve: {
                  item: function() { new Item(123).get(); }
                },
                controller: ['$scope', 'item', function($scope, item) {
                  $scope.dismiss = function() {
                    $scope.$dismiss();
                  };
    
                  $scope.save = function() {
                    item.update().then(function() {
                      $scope.$close(true);
                    });
                  };
                }]
            }).result.then(function(result) {
                if (result) {
                    return $state.transitionTo("items");
                }
            });
        }
    });
    

    这取决于模式的 ui-bootstrap。

    如果您更喜欢使用fancybox 或其他灯箱,您可以使用类似的方法。使用onEnter 回调来初始化灯箱,然后在关闭时转换到父状态。 (如果您在不关闭灯箱的情况下转换离开,您可能需要添加一个 onExit 回调。)

    【讨论】:

    • 我不明白 resolve 和 $scope.save 部分。有没有更简单/基本的解决方案?
    • @DiodeDan 这是用于更新项目的模式的示例代码,因此它具有一些在其他情况下可能不适用的元素。 $scope.save 用于模式上的保存按钮后面的功能。 resolve 用于将事物作为本地属性添加到控制器(例如所涉及的项目)。如果没有必要,可以将它们排除在外。
    • 有没有办法在return $state.transitionTo("items");处转换回之前的状态。想象一个网站头部的按钮,这个按钮打开一个模态框,这个模态框可以在网站的任何状态下打开。将状态转换回以前的状态而不是选择用户应该返回的特定状态是否有意义?接下去,让 modal 的 url 继承前一个 state 的 url 有意义吗?
    • @CMCDragonkai 你可能不得不使用 stateTransitionStart/End 事件来存储之前的状态,但是这应该是可行的。但是我在 angular-ui-router 中缺少的东西是能够将模态打开为状态集合的子状态(以便它继承 url 并且不会清除 ui-view 模态下的谎言覆盖)。 angular-ui-router 的 github 上有一些想法,但我认为他们不会很快开发出来。
    • @towr 这个问题正是我一直试图弄清楚的!它类似于多重继承问题。一个州可以是多个州的子州吗?