javascript - Angularjs - 数据绑定(bind)不适用于 Controller

标签 javascript angularjs twitter-bootstrap data-binding

我正在开发一个使用 bootstrap 的应用程序(v3.2.0) 与 angularjs (v1.2.26),我想创建一组columns可通过 dropdown 进行更改.

我的下拉数据绑定(bind)正常,但当用户在下拉列表中选择不同数量的列时,我无法更改 Bootstrap 响应列类。

这个fiddle显示到目前为止我的代码。

html...

<div data-ng-app="">
    <div class="container-fluid">
        <nav class="navbar navbar-default" role="navigation">
            <div class="container-fluid">
                <!-- Brand and toggle get grouped for better mobile display -->
                <div class="navbar-header">
                    <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">   <span class="sr-only">Toggle navigation</span>
    <span class="icon-bar"></span>
    <span class="icon-bar"></span>
    <span class="icon-bar"></span>

                    </button>   <span class="navbar-brand navbar-collapse-header">Header</span>

                </div>
                <!-- Collect the nav links, forms, and other content for toggling -->
                <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
                    <ul class="nav navbar-nav navbar-right">
                        <li data-ng-controller="ColumnController" id="columnDropDown" class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown">Columns: {{columnLayout.value}} <span class="caret"></span></a>

                            <ul class="dropdown-menu" role="menu">
                                <li data-ng-repeat="layout in columnLayouts">   <a data-ng-click="changeLayout(event)" href="#" class="portlet-column-number">{{layout.text}}</a>

                                </li>
                            </ul>
                        </li>
                    </ul>
                </div>
                <!-- /.navbar-collapse -->
            </div>
            <!-- /.container-fluid -->
        </nav>
    </div>
    <div class="row">
        <div data-ng-controller="ColumnController" data-ng-class="getLayoutClass()">
            <div class="panel panel-default">
                <div class="panel-heading mo-product-header">Header 1</div>
                <div class="panel-body">More content</div>
                <div class="panel-footer">Layout class is {{getLayoutClass()}}</div>
            </div>
        </div>
        <div data-ng-controller="ColumnController" data-ng-class="getLayoutClass()">
            <div class="panel panel-default">
                <div class="panel-heading mo-product-header">Header 2</div>
                <div class="panel-body">Some other content</div>
                <div class="panel-footer">Layout class is {{getLayoutClass()}}</div>
            </div>
        </div>
        <div data-ng-controller="ColumnController" data-ng-class="getLayoutClass()">
            <div class="panel panel-default">
                <div class="panel-heading mo-product-header">Header 3</div>
                <div class="panel-body">Some content</div>
                <div class="panel-footer">Layout class is {{getLayoutClass()}}</div>
            </div>
        </div>
    </div>
</div>

还有js...

function ColumnController($scope) {
    $scope.columnLayouts = [{
        value: 3,
        text: "Reset",
        layoutClass: "col-sm-6 col-md-4"
    }, {
        value: 1,
        text: "1",
        layoutClass: "col-sm-12"
    }, {
        value: 2,
        text: "2",
        layoutClass: "col-sm-6"
    }, {
        value: 3,
        text: "3",
        layoutClass: "col-sm-4"
    }];
    $scope.changeLayout = function () {
        $scope.columnLayout = this.layout;
    }
    $scope.getLayoutClass = function(){
        return $scope.columnLayout.layoutClass;
    }
    $scope.columnLayout = $scope.columnLayouts[0];
}

更新:

好吧,事实证明我应该只将“ColumnController”添加到一个元素,在这种情况下,该元素作为所有其他元素的包装器效果最好。

但是,我认为为了进一步改进这一点,我可能会创建一个单独的导航 Controller ,然后 broadcast有关更改的消息,在本例中,我可以让 ColumnController 监听有关列更改的消息并响应它们以更改驱动列布局的模型。

最佳答案

问题是您放置了太多data-ng-controller="ColumnController"。您无需将其添加到使用 Angular 绑定(bind) {{}}ngRepeat 的每个标记。您只需要包装容器上的一个。例如:

<div data-ng-app="" data-ng-controller="ColumnController">
    ...
</div>

演示:http://jsfiddle.net/pykm0tkv/25/

关于javascript - Angularjs - 数据绑定(bind)不适用于 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26240446/

相关文章:

javascript - 从字符串变量设置 ng-click 属性值

javascript - 在 Visual Studio 中为外部库启用 javascript intellisense

javascript - 当表格响应时, Bootstrap 可过滤弹出窗口在移动设备中消失

html - 小于 992px 的捕捉点搜索框定位出错?

twitter-bootstrap - Visual Studio 以加密方式发布 Bootstrap.Js

javascript - 持续访问 Google 日历 API

javascript - Ember AppKit 和使用 ember 数据的嵌入对象

jquery - 使用 Angular JS 的 Slick Carousel

javascript - DOM Mutation Observers 的跨浏览器支持情况如何?

javascript - 将 html 作为值发送到 textarea