1

このコードは、SharePoint でホストされているアプリ内に記述しました

<asp:Content ContentPlaceHolderID="PlaceHolderMain" runat="server">
    <div ng-app="MyApp">
        <div ng-controller="MyController">
            <p>{{webtitle}}</p>
              <form name="calcform">
                <p>{{calcform.item1.$error}}</p>
                <p>{{calcform.item1.$error}}</p>
                <span ng-show="calcform.item1.$error.numbersonly">item1 must be a number</span>
                <span ng-show="calcform.item2.$error.numbersonly">item2 must be a number</span>
                <input name="item1" ng-model="model.item1" numbersonly />            
                <input name="item2" ng-model="model.item2" numbersonly />
                <input ng-click="add()" type="button" value="+" ng-disabled="calcform.$invalid"/>
                <input ng-click="subtract()" type="button" value="-" ng-disabled="calcform.$invalid" />
                <input ng-click="multiply()" type="button" value="*" ng-disabled="calcform.$invalid"/>
                <input ng-click="divide()" type="button" value="/" ng-disabled="calcform.$invalid"/>                    
              </form>
              <p><font size="14">{{model.result}}</font></p>
        </div>
    </div>
</asp:Content>

ここでは、カスタム ディレクティブを使用して、ユーザーが入力フィールドに数字のみを入力していることを確認しています。

私のディレクティブは次のように実装されています

app.directive('numbersonly', function () {
    return {
        require: 'ngModel',
        link: function (scope, elem, attr, ctrl) {
            console.log('came inside directive');

            ctrl.$parsers.unshift(function (value) {
                var isNan = isNaN(value);
                ctrl.$setValidity('numbersonly', !isNan);
                console.log(ctrl);
                return (!isNan) ? value : undefined;
            });

            ctrl.$formatters.unshift(function (value) {
                var isNan = isNaN(value);
                ctrl.$setValidity('numbersonly', !isNan);
                return value;
            });
        }
    };
});

私のデバッグ コンソール ログ ステートメントでは、入力フィールドに入力された内容に応じて、毎回 ctrl オブジェクトが完全に設定されていることがわかります。

しかし

<span ng-show="calcform.item1.$error.numbersonly">item1 must be a number</span>

また

<p>{{calcform.item1.$error}}</p>

何も表示しません。

上記のコードをコピーして index.html と app.html に貼り付け、ブラウザでページを表示すると、すべて正常に動作し、すべてのオブジェクトが表示されます。

しかし、SharePoint 2013 内では、どういうわけか、ディレクティブが値を設定するスコープが失われ、$error オブジェクトがまったく表示されないため、ng-show は常に false と評価されます。

問題をより複雑にするために。Chrome で DOM ツリーを見ると、「フォーム名='calcform'」が SharePoint によって削除されていることがわかります。

ここに画像の説明を入力

4

0 に答える 0