【问题标题】:AngularJS: $watch for a select inputAngularJS:$watch 用于选择输入
【发布时间】:2015-05-03 01:52:43
【问题描述】:

我知道我们可以使用 ng-change 来解决这个问题,但我想了解为什么 $watch 在 select 上不起作用。也许我做错了什么,但似乎我不是唯一一个为此挣扎的人。 这是我的代码:

HTML:

<div class="list">
        <label class="item item-input item-select">
            <div class="input-label">
                Serveur
            </div>
            <select ng-model="server" ng-options="s as s.label for s in serverschoice">
            </select>
        </label>
    </div>

JS:

.controller('SettingsCtrl', function ($scope, $log, serverSelection) {

    //List of servers to connect to
    $scope.serverschoice = serverSelection.servers;
    $scope.server = serverSelection.server;
    $scope.$watch('server', function(NewValue, OldValue) {
        serverSelection.server = NewValue;
        $scope.url = serverSelection.url;
    }, true);

})

.service("serverSelection", function() {
    var self = this;

    self.servers = [
        { label: 'Production', value: 1, url: 'url1' },
        { label: 'Training', value: 2, url: 'url2' },
        { label: 'Local', value: 3, url: 'url2' }
    ];

    self.server = self.servers[1];
    console.log(self.server);
    self.url = self.server.url;

})

谢谢...

【问题讨论】:

    标签: javascript angularjs ionic-framework


    【解决方案1】:

    为了使其正常工作,您需要对代码进行多次更改,您需要将所有与服务器相关的信息放到一个名为 self.serverInfo 的对象中,该对象将包含有关 serverservers 的信息直接绑定此使用范围变量将根据 JavaScript 原型继承自动更新绑定。

    HTML

    <body ng-controller="SettingsCtrl">
      <div class="list">
        <label class="item item-input item-select">
          <div class="input-label">
            Server
          </div>
          {{serverInfo}}
          <select ng-model="serverInfo.server" 
          ng-options="s as s.label for s in serverInfo.servers">
          </select>
        </label>
      </div>
    </body>
    

    控制器

    var app = angular.module('app',[]);
    
    app.controller('SettingsCtrl', function ($scope, $log, serverSelection) {
    
        //List of servers to connect to
        $scope.serverInfo= serverSelection.serverInfo;
        $scope.$watch('serverInfo.server', function(NewValue, OldValue) {
            $scope.url = $scope.serverInfo.server.url;
        }, true);
    
    })
    
    app.service("serverSelection", function() {
        var self = this;
        self.serverInfo = {};
        self.serverInfo.servers = [
            { label: 'Production', value: 1, url: 'url1' },
            { label: 'Training', value: 2, url: 'url2' },
            { label: 'Local', value: 3, url: 'url2' }
        ];
    
        self.serverInfo.server = self.serverInfo.servers[1];
        console.log(self.server);
        self.serverInfo.url = self.serverInfo.server.url;
    
    })
    

    Working Plunkr

    【讨论】:

    • ServerSelection 服务是否应该返回一些东西,不是吗?
    • @curuba 那是我的错,你需要关注'serverSelection.server'
    • 嗯,这行不通。如果 HTML 部分只是注入控制器但未分配给 $scope 内的变量,则似乎无法访问 serverSelection 服务。
    • @curuba 现在看看我更新的代码 & plunkr ..一切都在工作..我会更新答案的描述..一会儿
    • 对不起,我错过了你的 ligne :$scope.serverSelection= serverSelection;现在它正在触发 $watch,我的 serverSelection.server 已更新,但我的 serverSelection.url 没有更新。我想我需要在我的服务中创建一个从 $watch 调用的方法。
    【解决方案2】:

    我接受来自@pankajparkar 的回答,但我想展示我的最终代码,因为事实上使用@pankajparkar 提出的正确绑定我不再需要$watch。

    HTML

        <div class="list">
            <label class="item item-input item-select">
                <div class="input-label">
                    Serveur
                </div>
                <select ng-model="serverSelection.server" ng-options="s as s.label for s in serverSelection.servers">
                </select>
            </label>
        </div>
        <p>URL: {{serverSelection.server.url}}</p>
    

    JS

    .controller('SettingsCtrl', function ($scope, $log, serverSelection) {
    
        //List of servers to connect to
        $scope.serverSelection= serverSelection;
    
    })
    
    
    .service("serverSelection", function() {
        var self = this;
    
        self.servers = [
            { label: 'Production', value: 1, url: 'url0' },
            { label: 'Training', value: 2, url: 'url1' },
            { label: 'Local', value: 3, url: 'url2' }
        ];
    
        self.server = self.servers[1];
    
    })
    

    【讨论】:

    • 这就是我试图在聊天 +1 中说的内容
    • 再次感谢@pankajpankar
    猜你喜欢
    • 2015-05-04
    • 2015-09-01
    • 2017-06-13
    • 2013-02-21
    • 2015-09-04
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多